如何在C++中创建具有引用成员的数组
How to create an array with reference member in C++?
我有一些类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&)
。
相关文章:
- 具有引用成员的结构是否具有唯一的对象表示形式
- 初始化右值引用成员
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++为具有引用成员变量的类创建复制构造函数
- 常量和引用成员函数限定符
- C++将引用成员绑定到构造函数参数
- 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- 初始化指针或引用成员变量以指向另一个成员
- 将常量引用成员设置为临时变量是否安全
- 对象超出范围后,引用成员设置为 0
- 复制构造函数初始化初始化列表中的引用成员会导致指针悬空
- 使用默认构造函数引用成员变量初始化错误
- 如何从派生类访问引用成员变量?
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为什么当类具有引用成员时C++编译器不删除复制构造函数
- 引用成员到构造函数参数按值传递
- 在执行不平凡的构造函数之前引用成员
- 具有引用成员变量的多态性
- 从按值构造函数参数初始化的引用成员
- 深度复制包含引用成员(C++)的结构