构造函数交叉指向另一个类的对象

时间:2014-07-15 21:25:26

标签: c++

我的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()
{

}

我该如何解决?

7 个答案:

答案 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)

使用您需要的构造函数,这是不可能的。您必须允许其中一个对象具有默认构造函数并稍后设置指针。