Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;嵌套类_C++_Nested Class - Fatal编程技术网

C++ C++;嵌套类

C++ C++;嵌套类,c++,nested-class,C++,Nested Class,我已经搜索了一些SO文章,但还没有找到任何能完全解决我问题的东西。如果这个答案已经存在,我道歉 先来点背景知识 我想用功能的“部分”来表示一个设备,其中的功能具有层次树状结构。而不是像 DeviceReferenceCheck(), DeviceRefereceSet(), DevicePhaseSetX(), DevicePhaseDefaultsSet...() 相反,我希望利用嵌套类,以便 dev.reference.check() dev.reference.set() dev.

我已经搜索了一些SO文章,但还没有找到任何能完全解决我问题的东西。如果这个答案已经存在,我道歉

先来点背景知识

我想用功能的“部分”来表示一个设备,其中的功能具有层次树状结构。而不是像

DeviceReferenceCheck(), 
DeviceRefereceSet(), 
DevicePhaseSetX(), 
DevicePhaseDefaultsSet...()
相反,我希望利用嵌套类,以便

dev.reference.check()
dev.reference.set()
dev.phase.setx()
dev.phase.defaults.set...()
为此,我尝试使用嵌套类来获取
obj.func.subfunction.subsubsubsub….()
结构。嵌套类需要引用最外层的类,因为它们需要使用其中提供的读/写函数

在我的尝试中,我不太明白的第一件事是。。。我自己也尝试过,但由于编译器警告而停止使用

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\u agilent53132a.cpp(5):警告C4355:“this”:用于基本成员初始值设定项列表

啊哈,我想我自己。。。聪明的编译器。。。在初始化器列表中使用
this
可能不是一个好主意,因为类尚未完全构造

问题1: 我上面说的对吗?在封闭类的初始化器列表中使用
this
,是不是给嵌套类一个对封闭类的引用,一个坏主意?我的想法是“是”,但希望得到一些澄清,因为在其他SO线程中,我看到了使用此方法()

我解决这个问题的方法是让一个成员指针指向嵌套,然后在构造函数中创建一个新的内部类,我可以在没有警告的情况下传入对*this的引用。这是标准的做法吗

继续

创建私有嵌套类的原因是顺便说一句,我不希望用户能够自己实例化该类。现在,我确实开始公开了。。。试图在嵌套类中使用私有构造函数,但编译器告诉我它无法构造该类。那么,假设封闭类可以看到嵌套的类私有数据成员

问题2: 为什么封闭类看不到嵌套类私有数据成员/函数

我的解决方法是让嵌套类将封闭类声明为友元。这真的有必要吗


谢谢你们的帮助

摘要

谢谢你对这个问题的解释。这是一个值得了解的有趣方法

我最终接受了自己的答案,因为我觉得它直接回答了问题。CRTP方法很好,但不能直接回答问题1和2,但确实提供了一个很好的替代方案

问题1:

这似乎是可能的。感谢您确认我对编译器为何生成警告以及忽略警告是否“安全”的怀疑

总之。。。在构造函数的初始化器列表中使用
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
    }
};

所以,这就是为什么我的外部类不能调用内部类的私有构造函数的原因。我的解决办法是让外部类成为内部类的朋友。即,在上述示例中,添加
friend e编码到内部类decl。

在初始值设定项列表中使用“this”不是一个好主意,因为如果您访问尚未构造的类的成员,您的程序可能会崩溃。话虽如此,如果只是存储一个指针供将来使用,就不会有任何问题。如果基类只存储引用,那么它是安全的。在这种情况下,我不会马上说这是个坏主意,但我会仔细看设计,因为这可能是其他问题的迹象。好的,谢谢大家。我解决这个问题的方法是让一个成员指针指向嵌套,然后在构造函数中实际创建一个
新的
内部类,在这里我可以在没有警告的情况下传递对
*这个
的引用。这是标准的做法吗?为什么在我提到的另一个SO线程中使用的是前一个方法?REFSC是一个类的原因是什么。您不存储指向它不是pimpl的指针。只需让一切都成为GPIBDevice_Agilent53132A的一部分。@Jimbo是的,我读过这篇文章,但在我看来,您正在构建很多类,这些类是高度耦合的,不单独使用。所有这些都是为了一点句法上的舒格。但是,如果您想拆分它,您可以尝试使用CRTP之类的东西来实现。所以你可以保存对这个的引用。但是,您对嵌套类的理解可能来自java背景吗?