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

时间:2019-01-19 06:10:55

标签: c++

我有两个对象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上妥协是合理的。有出路吗?

关于我的情况还有更多细节。我担心他们会掩盖主要问题,因此我将在下面的评论中发布。

2 个答案:

答案 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) {}
};

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

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

答案 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(); }