如何在C++中使用引用成员创建数组?

Chr*_*olf 5 c++ arrays reference

我有一些类Foo和Logger:

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

Foo::Foo(Logger& logger) : logger(logger)
{}
Run Code Online (Sandbox Code Playgroud)

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

Logger log (/* parameters */);
Foo objects [3] (log); // On stack
Foo* pObjects = new Foo [3] (log); // On heap
Run Code Online (Sandbox Code Playgroud)

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

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

gio*_*shc 5

您无法使用非默认构造函数初始化对象数组.但是你可以使用这里显示的向量(看第一个回复)

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

Foo* pObjects[3];

for (int i = 0; i < 3; ++i) {
   pObjects[i] = new Foo(log);
}
Run Code Online (Sandbox Code Playgroud)


Rvd*_*vdK 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
 };
Run Code Online (Sandbox Code Playgroud)

并在 Foo 中使用它,例如:

 Logger::getInstance().log("test");
Run Code Online (Sandbox Code Playgroud)

或者

 Logger& logger = Logger::getInstance();
 logger.log("test");
Run Code Online (Sandbox Code Playgroud)

(来自 @Loki Astari 的单例:C++ 单例设计模式