2012-04-04 75 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

相关问题