c ++对外部类

时间:2015-06-02 15:23:41

标签: c++ reference inner-classes

只是出于好奇,是否可以声明对内部类的引用 一个外层阶级:

class A{
    private:
        class B{
            public:
                B(double val):val_(val){}
            private:
                double val_;
        };

    public:
        A(double val):b(B(val)){} /*problem*/

    private:
        B& b;
};

int main(){
    A a(1.0);
}

感觉逻辑是不可能的,因为我看不出如何分配 引用临时变量。但我想确定一下。 (我想要 使用ref而不是指针来保证B中存在A。)

修改

我有问题为什么我愿意这样做,这是我的目标。让我们想象一下 class B包含大量数据并需要大量内存。我不 想要有很多B副本,否则我会耗尽内存。现在我有两个 同时继承C的班级DA。我希望他们与之相关 B的同一个实例。我可以用指针做到这一点,但正如我之前所说的那样 确保在某个地方至少存在B,所以我通过使用a 参考我能够保证这一点。我也希望B成为内心 这样我不会污染我的代码。感谢您的帮助,我现在使用右值 引用和我的代码如下所示:

class A{
    class B{
        public:
            B(double val):val_(val){}
        private:
            double val_;
    };

    public:
    A(double val):b(B(val)){}
    A(A const& a):b(a.b){}/*new problem*/

    protected:
    B&& b;
};

class C: public A{
    public:
        C(A const& a):A(a){}
};

class D: public A{
    public:
        D(A const& a):A(a){}
};

int main(){
    A a(1.0);
    C c(a);
    D d(a);
}

但它没有编译。

2 个答案:

答案 0 :(得分:3)

如果使用右值引用,它将编译

class A
{
   struct B {};
   B&& b;

public:
   A() : b(B()) {}
};

int main()
{
    A a;
}

...但是,令人讨厌的是,这是一个悬空引用,这是一项特殊规则,禁止成员b延长该临时B()的生命周期,否则可能会:

  

[C++11: 12.2/5]: [..] 构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。 [..]

现在,如果Bpublic,并且B对象是从其他地方传入的,那么您已经实现了目标:

struct A
{
   struct B {};
   B& b;

   A(B& b) : b(b) {}
};

int main()
{
    A::B b;
    A a(b);
}

live demo

但是,如果不这样做,我看不出你还能做些什么来实现这个目标。

但是,它看起来效用有限;只有一个真正的B成员!

答案 1 :(得分:2)

如果要在复制的成员之间共享对象,请使用std :: shared_ptr。 它是保证B对象永久存在于使用它的所有A对象的唯一标准方法。