我的c ++代码遇到了麻烦
我有两节课:
控制台和记录器
唯一的问题是构造函数应该如下所示:
Console(Logger * L): L(L) // Copy pointer
Logger(Console * C): C(C)
我的整个程序看起来应该是
Console C(&L); // BUT L IS NOT DEFINED YET
Logger L(&C);
int main()
{
}
我该如何解决?
答案 0 :(得分:3)
答案是,这取决于。
这两个对象是否需要另一个对象启动并运行? 你是SOL,他们不能同时建造。重新考虑你的设计。也许你可以在没有引用其中一个对象的情况下设置基本服务,想想多阶段初始化。
两者是否只需保存该参考以供日后使用?
订单无关紧要,至少使用其中一个订单的前瞻性声明。您甚至可以在单独的编译单元中定义它们。
他们中的其中一个是否可能在其ctor / dtor中使用另一个(包括间接)? 稍后在同一个编译单元中定义该对象,你没事。
extern Type name; // This is a forward declaration, like in headers
答案 1 :(得分:1)
您必须将其中一个移出其构造函数并在创建后传递它:
Console C;
Logger L(&C);
C.set(&L);
答案 2 :(得分:0)
Console(){}
Logger(Console * C): C(C) {C->L=this;}
Console C();
Logger L(&C);
答案 3 :(得分:0)
不幸的是,不,我建议您将它们的“绑定”移动到单独的函数中。
对于这个特定用例,我建议在两个类中创建bindLogger
方法:
void Console::bindLogger( Logger * logger ) {
if (logger != L) {
L = logger;
logger->bindConsole( this );
}
}
答案 4 :(得分:0)
我能想到的唯一可能不是好设计的解决方案是:
class Logger;
class Console;
class Console
{
public:
Console(Logger *l) : l(l) {}
private:
Logger *l;
};
class Logger
{
public:
Logger(Console *c) : c(c) {}
private:
Console *c;
};
class Together
{
public:
Together()
: c(&l)
, l(&c)
{
}
private:
Console c;
Logger l;
};
答案 5 :(得分:-1)
您必须动态创建两个对象中的一个,以避免初始化顺序出现问题。
答案 6 :(得分:-1)
使用您需要的构造函数,这是不可能的。您必须允许其中一个对象具有默认构造函数并稍后设置指针。