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

Constructors cross-pointing to objects of another class

本文关键字:对象 另一个 构造函数      更新时间:2023-10-16

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

我怎么解决这个问题?

答案是,视情况而定。

两个对象都需要另一个对象启动并运行吗?
你是SOL,它们不可能都是最后建造的。重新考虑你的设计。也许您可以在不引用其中一个对象的情况下设置基本服务,例如多级初始化。

是否都只需要保存引用以供以后使用?
顺序无关紧要,至少对其中一个使用前向声明。您甚至可以在单独的编译单元中定义它们。

它们中的一个是否有可能在其tor/dtor中使用另一个(包括间接地)?
稍后在同一编译单元中定义该对象,就可以了。

extern Type name; // This is a forward declaration, like in headers

您必须将其中一个移出其构造函数并在创建后传入:

Console C;
Logger L(&C);
C.set(&L);
Console(){} 
Logger(Console * C): C(C) {C->L=this;}
Console C();
Logger L(&C);

遗憾的是没有,我建议您将它们的"绑定"移动到一个单独的函数中。

对于这个特殊的用例,我建议在两个类中创建一个bindLogger方法:

void Console::bindLogger( Logger * logger ) {
     if (logger != L) {
         L = logger;
         logger->bindConsole( this );
     }
}

我能想到的唯一解决方案,可能不是一个好的设计,是:

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;
};

必须动态地创建两个对象中的一个,以避免初始化顺序的问题。

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

相关文章: