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对象的指针吗?
您无法使用非默认构造函数初始化对象数组.但是你可以使用这里显示的向量(看第一个回复)
对于堆,您可以执行以下操作:
Foo* pObjects[3];
for (int i = 0; i < 3; ++i) {
pObjects[i] = new Foo(log);
}
Run Code Online (Sandbox Code Playgroud)
对于一般用途,我通常将记录器设为单例,因此只有一个记录器,并且可以从所有组件访问。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++ 单例设计模式)