C++ nested classes
C++ nested classes
我已经搜索了一些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
可能不是一个好主意,因为类还没有完全构造好。
问题1:我上面说的对吗?在封闭类的初始化器列表中使用this
为嵌套类提供对封闭类的引用,这是个坏主意吗?我的想法是"是的",但我希望得到一些澄清,因为在其他SO线程中,我看到了这种方法的使用(嵌套类成员函数不能访问封闭类的函数。为什么?)。
我解决这个问题的方法是嵌套一个成员指针,然后在构造函数中创建一个新的内部类(所以现在可以安全地使用它,因为类已经构造好了),在那里我可以在没有警告的情况下传递对*this的引用。这是标准的做法吗?
继续…
私人嵌套类的原因是顺便说一句,我不希望用户能够自己实例化该类。现在,我确实公开了。。。试图在嵌套类中使用私有构造函数,但编译器告诉我它无法构造该类。那么,假设封闭类可以看到嵌套类的私有数据成员?
问题2:为什么封闭类不能看到嵌套类的私有数据成员/函数?
我的解决方法是让嵌套类将封闭类声明为友元。这真的有必要吗?
谢谢你们的帮助!
摘要
感谢Jan对奇怪地重复出现的模板模式的解释。这是一个有趣的方法。
我最终接受了自己的答案,因为我觉得它直接回答了问题。CRTP方法是好的,但不能直接回答问题1&2,但确实提供了一个很好的替代方案。
问题1:
这似乎是可能的。感谢mkirci和R。Martinho Fernandes确认了我对编译器生成警告的原因以及忽略警告是否"安全"的怀疑。
总之。。。在构造函数的初始化器列表中使用this
不是最好的主意,因为类尚未构造。正如这些人所指出的,如果使用指针,这可能会导致UB。我决定使用我的工作,即使用指向内部类的指针,然后在外部类构造函数中创建一次。。。通过这种方式,外部类已经创建,并且可以安全地将对自身的引用传递给内部类。
问题2:
根据C++标准,我发现(经过大量挖掘)在11.7:中
嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第11条)。
该标准给出了以下示例:
class E {
int x;
class B { };
class I {
B b; // OK: E::I can access E::B
int y;
void f(E* p, int i) {
p->x = i; // OK: E::I can access E::x
}
};
int g(I* p) {
return p->y; // error: I::y is private
}
};
所以,这就是(令人恼火的)为什么我的外部类不能调用内部类的私有构造函数。我的解决方案是让外部阶级成为内部阶级的朋友。I.e在上面的例子中将friend E;
添加到内部类decl中。
- Threads with Classes and std::packaged_task
- Nested static_cast and const_cast
- DataStax C++ Cassandra Nested UDTs
- C++ Classes/Confusion
- CMake nested libraries
- 在使用Qt Designer Form Classes扩展我自己的自定义小部件时防止重复的自动连接
- Classes composition
- C++ - 创建游戏实体时,我应该使用"sub classes"还是结构?
- 为什么C++不支持"nested-comment"?
- "Nested" 带括号的类模板参数推导:GCC vs. clang
- 模板尾部结构抬高"incomplete type in nested name specifier"
- ex.nested try-catch中的什么()更改
- C++中"classes"(非对象)的哈希表
- inheritance Classes
- C++11 empty flag classes
- Derived Classes C++
- 头文件类成员函数声明错误:"incomplete type name in nested name specifier"
- C++ "Virtual functions handling on multiple base classes"
- C++ nested classes
- Nested Classes C++