C++ 两个具有相互指向 const 指针的对象
c++ two objects with const pointers to each other
我有两个对象,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;
};
显然这里有循环逻辑,但我觉得要求两个可以相互引用的对象是合理的,而不必在常量上妥协。有出路吗?
关于我的情况还有一些细节。我担心他们会掩盖主要问题,所以我将在下面的评论中发布。
我找不到这个问题的解决方案,因为显然必须在另一个之前初始化一个或另一个,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
的对象的唯一方法。如果没有容器对象,您将无法初始化它们。
目前还不清楚为什么要以这种方式设计类。很可能有更好的设计可以满足您的需求。
回答我自己的问题,这是我迄今为止想出的最佳解决方案。类 A 和 B(表示 GUI 元素)继承自类 Base,该类包含指向父对象的静态指针。同一父对象授予对 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(); }