C++ 两个具有相互指向 const 指针的对象

c++ two objects with const pointers to each other

本文关键字:互指 const 指针 对象 两个 C++      更新时间:2023-10-16

我有两个对象,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) {}
};

但是,这是初始化类型为 AB 的对象的唯一方法。如果没有容器对象,您将无法初始化它们。

目前还不清楚为什么要以这种方式设计类。很可能有更好的设计可以满足您的需求。

回答我自己的问题,这是我迄今为止想出的最佳解决方案。类 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(); }