我有两个对象A和B,它们都是从一个公共基类派生的,并且都包含在一个单独的父类中。我希望A和B可以访问彼此的指针或引用,以便它们可以调用彼此的成员函数。理想情况下,这些指针/引用将是const,因此不能更改它们。但是,如果是这种情况,则必须将它们初始化。我很难找到解决该问题的方法,因为很明显一个或另一个A或B必须先于另一个被初始化。
简而言之,这就是我要实现的目标:
class Base
{
};
class A : public Base
{
public:
Base& const refToB;
//some constructor here, but how can it refer to an object that doesn't yet exist?
};
class B : public Base
{
public:
Base& const refToA;
// some constructor here
};
class Parent
{
public:
A a;
B b;
};
这里显然有循环逻辑,但是我觉得要求两个可以相互引用的对象而不必在const上妥协是合理的。有出路吗?
关于我的情况还有更多细节。我担心他们会掩盖主要问题,因此我将在下面的评论中发布。
答案 0 :(得分:3)
我很难找到解决这个问题的方法,因为很明显,一个或另一个A或B必须先于另一个被初始化。
您可以使用:
class Base
{
};
class A;
class B;
class A : public Base
{
public:
A(B const& b) : refToB(b) {}
B const& refToB;
};
class B : public Base
{
public:
B(A const& a) : refToA(a) {}
A const& refToA;
};
class Parent
{
public:
A a;
B b;
Parent() : a(b), b(a) {}
};
但是,这是初始化A
和B
类型的对象的唯一方法。没有容器对象,您将无法初始化它们。
不清楚为什么要用这种方式设计类。很有可能有更好的设计可以满足您的需求。
答案 1 :(得分:1)
回答我自己的问题,这是到目前为止我提出的最佳解决方案。 A类和B类(代表GUI元素)继承自Base类,该类包含指向 parent 对象的静态指针。相同的父对象授予朋友访问A和B的权限,以便他们可以根据需要访问彼此的公共功能。该系统的优点是您可以轻松地创建和链接新的GUI对象(C,D ...):您需要做的就是从Base继承并更新Parent中的友谊。
代码如下:
class Parent; // forward declaration for Base class static variable
class Base // class Base is just there to hold a pointer to the parent object for its derived classes
{
private:
static Parent * parent_ptr;
public:
Parent* getParent() const { return parent_ptr; }
};
class A : public Base
{
public:
int a_int;
A(const int a) : a_int(a) {}
void someFunction() const { std::cout << a_int; }
};
class B : public Base
{
public:
int b_int;
B(const int b) : b_int(b) { doSomethingToA(); } // Initiating this from the constructor, but really I would want to wait for a Listener
void doSomethingToA() const;
};
class Parent
{
private:
A a = { 2 };
B b = { 3 };
friend class A;
friend class B;
} parent;
Parent* Base::parent_ptr = &parent;
void B::doSomethingToA() const { getParent()->a.someFunction(); }