5

我有一些类 Foo 和 Logger:

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

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

现在我想创建一个 Foo 类的对象数组,其中所有引用Foo::logger都应该指向同一个Logger对象。我尝试了类似的东西(我需要堆栈和堆分配):

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

问题是两个版本都试图调用Foo()不存在的默认构造函数。此外,据我了解,无法更改引用的引用变量。因此,对默认构造函数的临时调用和稍后在循环中的初始化也无济于事。

那么:正确的方法是什么?我需要使用指向Logger对象的指针吗?

4

3 回答 3

5

您不能使用非默认构造函数初始化对象数组。但是,您可以使用此处显示的向量(查看第一个回复)

对于堆,您可以执行以下操作:

Foo* pObjects[3];

for (int i = 0; i < 3; ++i) {
   pObjects[i] = new Foo(log);
}
于 2012-04-04T13:47:42.037 回答
2

您可以使用 C++11 大括号初始化使用非默认构造函数初始化对象数组:

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

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


编辑:在 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&).

于 2012-04-04T13:55:14.423 回答
2

对于一般用途,我通常将记录器设为单例,因此只有一个记录器,并且可以从所有组件中访问。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
 };

并在 Foo 中使用它,例如:

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

或者

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

(Credits for singleton from @Loki Astari : C++ Singleton design pattern )

于 2012-04-04T13:59:22.017 回答