在实例中传递另一个类

时间:2009-11-09 18:57:32

标签: c++ oop

我想知道什么是最好的做法。在同一个类的两个实例中传递(另一个类)(让我们称之为'Primary')。因此,基本上在第一个的构造函数中,我可以初始化外部实例(让我们称之为“共享”) - 然后在main()中处理此类时将其设置为特定值。

所以'共享',可能是一个int,比如现在说999。

现在如果我创建主类'Primary'的另一个实例怎么办?什么是访问已经初始化的“共享”外部实例的最佳方式 - 因为如果我没有正确处理这个问题,那么'Primary'的构造函数再次被调用时将继续创建另一个'Shared'实例,因此我放宽了999的值。我可以想到一些涉及动态指针和if语句的杂乱解决方案(只是)但我觉得可能有一个更简单,更清晰的解决方案?

3 个答案:

答案 0 :(得分:3)

据我所知:

  • 你有一个A级
  • 你有一个B级
  • 对于A类的所有成员,只有一个B类实例

您没有提及是否使用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建议的那样。