只是出于好奇,是否可以声明对内部类的引用 一个外层阶级:
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
的班级D
和A
。我希望他们与之相关
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);
}
但它没有编译。
答案 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)中的引用成员的临时绑定将持续存在,直到构造函数退出。 [..]
现在,如果B
为public
,并且B
对象是从其他地方传入的,那么您已经实现了目标:
struct A
{
struct B {};
B& b;
A(B& b) : b(b) {}
};
int main()
{
A::B b;
A a(b);
}
但是,如果不这样做,我看不出你还能做些什么来实现这个目标。
但是,它看起来效用有限;只有一个真正的B
成员!
答案 1 :(得分:2)
如果要在复制的成员之间共享对象,请使用std :: shared_ptr。 它是保证B对象永久存在于使用它的所有A对象的唯一标准方法。