我想知道什么是最好的做法。在同一个类的两个实例中传递(另一个类)(让我们称之为'Primary')。因此,基本上在第一个的构造函数中,我可以初始化外部实例(让我们称之为“共享”) - 然后在main()中处理此类时将其设置为特定值。
所以'共享',可能是一个int,比如现在说999。
现在如果我创建主类'Primary'的另一个实例怎么办?什么是访问已经初始化的“共享”外部实例的最佳方式 - 因为如果我没有正确处理这个问题,那么'Primary'的构造函数再次被调用时将继续创建另一个'Shared'实例,因此我放宽了999的值。我可以想到一些涉及动态指针和if语句的杂乱解决方案(只是)但我觉得可能有一个更简单,更清晰的解决方案?
答案 0 :(得分:3)
据我所知:
您没有提及是否使用A构造函数中的任何参数来初始化B!
用于B的第二个A的参数会发生什么变化?
因此我们假设B是默认构造的
我们还假设您需要延迟评估B的实例,否则您只需使用静态成员。
class A
{
B& bRef;
public:
A()
:bRef(getLazyB()) // Get a reference to the only B for your object.
{}
private:
static B& getLazyB()
{
static B instance; // Created on first use
return instance; // returned to all users.
}
};
答案 1 :(得分:2)
使构造函数获取指向共享类的指针或引用。在外面建造更容易。
class Shared;
class Same
{
shared& shared_;
Same( Shared& s ) { shared_ = s; }
}
适当使用const和其他构造函数等。
答案 2 :(得分:0)
这取决于类的语义。如果外部类实际上不在外面,而是在实例之间共享一些模糊的实现细节,则将第一个实例传递给第二个实例的构造函数,并在那里获得对外部实例的引用。
如果外部类本身实际上是一个具有含义的外部类,则在外部创建并将其传递给构造函数,就像Mark建议的那样。
如果不仅两个特定实例而且所有实例共享同一个外部类的实例,请考虑将其作为类的静态成员,正如Martin York建议的那样。