2009-11-09 96 views
0

我想知道什么是最佳实践。在同一类的两个实例中传递(另一个类)(让我们称之为“主”)。所以,基本上在第一个构造函数中,我可以初始化外部实例(让我们称之为“Shared”),然后在main()中处理这个类时将其设置为特定值。在实例中传递另一个类

所以'共享',可能是一个整数,现在说999。

现在如果我创建主类'Primary'的另一个实例呢?最好的方式来访问已被初始化的'Shared'的外部实例 - 因为如果我没有正确处理这个问题,'Primary'的构造函数在再次调用时会继续并创建一个'Shared'实例,因此我失去了价值999 ..我可以想到一些凌乱的解决方案涉及动态指针,如果声明(只),但我有一种感觉可能有一个更简单,更干净的解决方案?

+0

难以遵循......你能详细说明一些代码吗? – fretje 2009-11-09 19:00:40

+1

你的问题很混乱。类不会被初始化;实例。你能否修改你的问题来更精确地使用“类”和“实例”这些术语? – 2009-11-09 19:00:46

+0

并尽量避免像“这个班级”这样的词汇。我无法分辨您是指外部班级还是班级的其他实例(无论他们是什么)。 – 2009-11-09 19:04:16

回答

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. 
     } 
}; 
+0

谢谢你!真棒:) – oneAday 2009-11-09 19:11:46

+0

但是,这引入了一个单线程,将有线程和测试问题。你也不能发送参数给它的构造函数。这取决于你需要的细节 – Mark 2009-11-09 19:16:44

+0

@Mark:是的,这个绝对简单的演示介绍了一个singelton。但在tdd环境中,将getLazyB()转换为工厂来生成appropraite对象本身很简单。但我发现一次回答一个问题通常会更好。不要试图一举解释整个C++。 – 2009-11-09 19:25:50

2

使构造函数获取指向共享类的指针或引用。外部建设更容易。

class Shared; 

class Same 
{ 
    shared& shared_; 

    Same(Shared& s) { shared_ = s; } 
} 

随着appropiate使用const和其他的构造等

+2

如果要引用共享类的实例,那么需要解决的一件事就是所有权 - 谁负责清理“共享”对象实例?它是“Same”实例还是其他什么?没有一个正确的答案 - 但是这是共享设计时需要考虑的问题。 – 2009-11-09 19:06:49

+0

同意重新拥有。 – Mark 2009-11-09 19:14:57

0

这取决于你的类的语义。如果外部类不是真的在外面,而是恰好在实例之间共享的一些模糊的实现细节,则将第一个实例传递给第二个实例的构造函数,并在那里获取对外部实例的引用。

如果外部类真的是一个具有自身意义的外部类,那么在外部创建它并将其传递给构造函数,就像Mark建议的那样。

如果不只是两个特定的实例,但所有实例都共享外部类的相同实例,请考虑将其设置为类的静态成员,正如Martin York所建议的那样。