繁体   English   中英

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;
};

显然这里有循环逻辑,但是我觉得要求两个可以互相引用的对象而不必在const上妥协是合理的。 有出路吗?

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

我很难找到解决此问题的方法,因为很明显一个或另一个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对象的唯一方法。 没有容器对象,您将无法初始化它们。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM