2012-04-04 77 views
5

我有一些類Foo和記錄儀:如何用C++中的引用成員創建一個數組?

class Logger{/* something goes here */}; 
class Foo{ 
    Foo(Logger& logger); 
    Logger& logger; 
} 

Foo::Foo(Logger& logger) : logger(logger) 
{} 

現在我想創造一個所有引用Foo::logger應該指向同一個對象Logger類Foo的對象的數組。我想是這樣(我需要堆棧和堆分配):

Logger log (/* parameters */); 
Foo objects [3] (log); // On stack 
Foo* pObjects = new Foo [3] (log); // On heap 

的問題是,這兩個版本的嘗試調用默認的構造函數Foo()這是不存在的。也據我所知,不可能改變引用的引用變量。所以臨時調用默認的構造函數和稍後的循環也沒有幫助。

那麼:什麼是正確的做法呢?我需要使用指向Logger對象的指針嗎?

回答

2

對於一般用途,我通常將記錄器設置爲Singleton,因此只有一個可以從所有組件訪問。 http://en.wikipedia.org/wiki/Singleton_pattern

這也使得Foo的構造函數更加簡單。

class Logger 
{ 
    public: 
     static Logger& getInstance() 
     { 
      static Logger instance; 
      return instance; 
     } 

     public log(const std::string& txt) 
     { 
      //do something 
     } 

    private: 
     Logger() {} 
     Logger(Logger const&);    // Don't Implement. 
     void operator=(Logger const&); // Don't implement 
}; 

並使用它像美孚:

Logger::getInstance().log("test"); 

Logger& logger = Logger::getInstance(); 
logger.log("test"); 

(從@Loki阿斯塔學分單:C++ Singleton design pattern

+0

要確定我理解你:你的意思是一些靜態成員的所有對象?那麼如何初始化它呢?或者一個單獨的對象/全局變量/ ...? – 2012-04-04 14:11:33

+0

他意味着你的代碼中的任何地方都可以訪問的單例類。這是記錄器的常用方式。 – giorashc 2012-04-04 14:33:20

5

您無法使用非默認構造函數初始化對象數組。 但是你可以使用矢量如圖here(先看第一個回覆)

而對於堆,您可以執行以下操作:

Foo* pObjects[3]; 

for (int i = 0; i < 3; ++i) { 
    pObjects[i] = new Foo(log); 
} 
2

您可以使用非默認初始化objecs數組

class Logger{/* something goes here */}; 
class Foo{ 
public: 
    Foo(Logger& logger); 
private: 
    Logger& logger; 
}; 

Foo::Foo(Logger& logger) : logger(logger) 
{} 


編輯:使用C++ 11大括號初始化構造在C++ 11,可以使用 vector做你想做的事:

#include <vector> 
class Logger{/* something goes here */}; 
class Foo{ 
public: 
    Foo(Logger& logger) : logger(logger) {} 
private: 
    Logger& logger; 
}; 

int main() { 
    Logger log; 
    std::vector<Foo>(3, log); 
} 

請注意,vector解決方案將無法在C + + 03中工作。在C++ 03中,矢量構造函數調用Foo::operator=。在C++ 11中,它調用Foo::Foo(const Foo&)

+0

,只有當我知道這個工作先驗元素的數量,對嗎?這對我的問題並非總是如此。 – 2012-04-04 14:02:25

+0

確實,這是一個問題。但是要意識到,當你在堆棧上創建數組時,你必須先知道元素的數量。 – 2012-04-04 14:06:45

相關問題