如何在C++中创建具有引用成员的数组

How to create an array with reference member in C++?

本文关键字:引用 成员 数组 创建 C++      更新时间:2023-10-16

我有一些类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对象的指针吗?

不能使用非默认构造函数初始化对象数组。然而,您可以使用矢量,如图所示(查看第一个回复)

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

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

对于一般用途,我通常将记录器设为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
 };

并在Foo-like中使用:

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

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

(来自@Loki Astari的singleton:C++singleton设计模式)

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

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&)