我阅读了Scott Meyers 关于这个主题的文章,并对他所谈论的内容感到很困惑.我这里有3个问题.
问题1
为了详细说明,假设我写一个简单的vector<T>类等的方法push_back,insert和运营商[].如果我遵循Meyers的算法,我最终会得到所有非会员朋友的功能.我将有一个带有很少私有成员和许多非成员朋友函数的向量类.这是他在说什么?
问题2
我仍然不了解非成员函数如何改进封装.考虑一下迈耶斯文章中给出的代码.
class Point {
public:
int getXValue() const;
int getYValue() const;
void setXValue(int newXValue);
void setYValue(int newYValue);
private:
... // whatever...
};
Run Code Online (Sandbox Code Playgroud)
如果遵循他的算法,setXXXX方法应该是非成员.我的问题是如何增加封装?他还说
我们现在已经看到,衡量一个类中封装量的合理方法是计算在类的实现发生变化时可能会被破坏的函数数量.
直到我们在类实现发生变化时保持方法签名不变,没有客户端代码会被破坏并且封装得很好,对吧?这同样适用于非成员函数.那么非成员函数提供的优势是什么?
问题3
引用他的算法
else if (f needs type conversions
on its left-most argument)
{
make f a non-member function;
if (f needs access to non-public
members of C)
make f a friend of C;
}
Run Code Online (Sandbox Code Playgroud)
他的意思是f需要在最左边的参数上进行类型转换?他还在文章中说了以下内容. …
我一直在尝试通过安装 RQuantLib 包
install.packages("RQuantLib")
Run Code Online (Sandbox Code Playgroud)
它不断给我以下错误
* installing *source* package ‘RQuantLib’ ...
** package ‘RQuantLib’ successfully unpacked and MD5 sums checked
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the …Run Code Online (Sandbox Code Playgroud) 我正在维护一个旧编译器仍然支持的库,其中之一是 Windows 上的 Visual C++ 2013。到目前为止,我们一直非常保守并坚持使用 C++03;我们现在正在转向 C++11。VC++2013 支持大部分较新的特性,但它不识别noexcept.
当然,将它添加到代码中的规范方法是定义类似的东西
#if (the compiler does not support it)
#define NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
void f() NOEXCEPT;
Run Code Online (Sandbox Code Playgroud)
当然,缺点是我们在代码周围散布了宏。
然而,我突然想到(可能是我肩膀上的一个小守护恶魔建议)我也可以写
#if (the compiler does not support it)
#define noexcept
#endif
Run Code Online (Sandbox Code Playgroud)
之后我可以写
void f() noexcept;
Run Code Online (Sandbox Code Playgroud)
并且该关键字将被较新的编译器正确使用并在较旧的编译器上定义。
这有效(就像它成功编译一样)但是,我感觉有点脏——我不确定我应该这样做。当然,定义关键字的标准是禁止定义的;但是如果编译器不完全支持标准,还是我处于某种灰色区域,它仍然如此吗?