我已经搜索了一些 SO 文章,但还没有找到任何可以解决我的问题的东西。如果这个答案确实已经存在于某处,我们深表歉意。
先说一点背景...
我想表示一个具有“部分”功能的设备,其中功能具有分层的树状结构。而不是有很多扁平化的功能,比如
DeviceReferenceCheck(),
DeviceRefereceSet(),
DevicePhaseSetX(),
DevicePhaseDefaultsSet...()
相反,我想利用嵌套类,这样我就可以得到
dev.reference.check()
dev.reference.set()
dev.phase.setx()
dev.phase.defaults.set...()
为此,我尝试使用嵌套类来获取obj.func.subfunction.subsub....()
结构。嵌套类需要对最外层类的引用,因为它们需要使用那里提供的读/写函数。
在我的尝试中,我不太了解的第一件事如下......我自己尝试过,但由于编译器警告而停止使用它。
class GPIBDevice_Agilent53132A : public GPIBDevice
{
private:
class RefOsc {
public:
// ... snip ...
RefOsc(GPIBDevice_Agilent53132A &parent);
// ... snip ...
} ro;
public:
// ... snip ...
GPIBDevice_Agilent53132A();
// ... snip ...
};
GPIBDevice_Agilent53132A::GPIBDevice_Agilent53132A() : GPIBDevice(), ro(*this)
{
}
编译器说:gpibdevice_agilent53132a.cpp(5): warning C4355: 'this' : used in base member initializer list
。
啊哈,我想我自己......聪明的编译器......this
在初始化列表中使用可能不是一个好主意,因为该类尚未完全构建。
问题一:
我上面说的对吗?在封闭类的初始化程序列表中使用this
, 给嵌套类提供对封闭类的引用,这是一个坏主意吗?我的想法是“是”,但想澄清一下,因为在其他 SO 线程中,我已经看到使用了这种方法(嵌套类成员函数无法访问封闭类的函数。为什么?)。
我解决这个问题的方法是有一个指向嵌套的成员指针,然后当实际在构造函数中时(现在可以安全地使用 this,因为已经构造了类)创建了一个新的内部类,我可以在其中传递对 *this 的引用而无需警告。这是标准的做法吗?
继续……
私有嵌套类的原因是顺便说一句,我不希望用户能够自己实例化该类。现在,我确实将它公开...尝试在嵌套类中使用私有构造函数,但编译器告诉我它无法构造该类。那么大概封闭类可以看到嵌套类私有数据成员?
问题 2: 为什么封闭类看不到嵌套类的私有数据成员/函数?
我的解决方法是让嵌套类将封闭类声明为朋友。这真的有必要吗?
谢谢你们的帮助!