构造函数交叉指向另一个类的对象
Constructors cross-pointing to objects of another class
我的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;
};
必须动态地创建两个对象中的一个,以避免初始化顺序的问题。
对于您需要的构造函数,这是不可能的。您必须允许其中一个对象具有默认构造函数并稍后设置指针。
相关文章:
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- Qt:从另一个窗口访问公共对象
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 结束另一个线程中使用的对象的生存期
- 如何将我编写的对象传递到另一个类的构造函数中?
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 在C++中将对象从另一个类传递到另一个类的构造函数?
- 删除对象(另一个..)时双重释放或损坏