Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同一基类的两个派生对象如何通信?_C++_Design Patterns_Derived Class - Fatal编程技术网

C++ 同一基类的两个派生对象如何通信?

C++ 同一基类的两个派生对象如何通信?,c++,design-patterns,derived-class,C++,Design Patterns,Derived Class,我有以下情况 class B { public: B() {}; virtual ~B() {}; virtual void seti( int x ) { i = x; }; virtual void setj( int x ) { j = x; }; virtual void add() =0; protected: int i; int j; }; class D : public B { public: virtual voi

我有以下情况

class B {
public:
    B() {};
    virtual ~B() {};
    virtual void seti( int x ) { i = x; };
    virtual void setj( int x ) { j = x; };
    virtual void add() =0;

protected:
    int i;
    int j;
};
class D :  public B {
public:
 virtual void add() { cout << "D-add:" << i + j << endl; }; 
};

class E: public B {
public:
    void seti( int x ) { i = x; };
    void add() { cout << "E-add:" << i + j << endl; }; 
    void mult() { cout << "E-mult:" << i * j << endl; }; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    D *d = new D();
    d->seti(4); d->setj(5); d->add();
    E*e = d;
    e->seti(8); e->add(); e->mult();
    return 0;
}
B类{
公众:
B(){};
虚拟~B(){};
虚空集i(intx){i=x;};
虚空集j(intx){j=x;};
虚空添加()=0;
受保护的:
int i;
int j;
};
D类:公共B类{
公众:

virtual void add(){cout我认为您需要的是一个“conversion ctor”-E上的一个构造函数,它将指向D的引用/指针作为参数,并根据D的值填充自身。要复制B上定义的字段,可以执行以下操作:

class B {
public:
....
  B(B& source) { this->i = source.i; this->j = source.j; }
....
}
class E {
public:
....
  E(D& source) : B(source) { // no need to do anything about i,j
  }
....
}
此外,您还可以编写一个转换器类(DtoEConverter),该类将具有执行此操作的函数。

您可以更改

class E: public B {

d
是指向
d
的指针。您不能将指向
d
的指针分配给指向
E
的变量,因为类型没有直接关系

它们在基类上是相关的,但是
d
不是
E
,这就是您遇到的问题

您可以这样做:

B* e = d;
因为
d
是a
B

顺便说一下,您的问题标题是:

同一基类的两个派生对象如何通信

强调我的。你没有两个派生对象——你只有一个。有两个类,但你只实例化一个实际对象,如下所示:

 D *d = new D();

我不是一个C++程序员,但是我想尝试提供一个替代方案,基于我们在C Spurial/P>中可能做的事情。 您可以潜在地将接口添加到类D中……比如说接口IAdd,然后将类D传递到类E中

因此,在类E的构造函数中,可以有如下内容:公共E(接口x)…传入类D而不是x

请让我知道这是否有帮助:)


考虑到

与其用班级间的交流来污染你的主要班级,不如引入一个新班级

class DECommunicator
{
public:
  DECommunicator(D* dPtr, E* ePtr)
  {
    mDPtr = dPtr;
    mEPtr = ePtr;
  }

  void DSetI(int x)
  {
    mDPtr->setI(x);
  }

  // add additional methods to allow D to "talk" to E and vice versa

private:
  D* mDPtr;
  E* mEPtr;
}

很难给出代码,因为根据您的示例,我不太确定您想要实现什么。

像静态成员一样?谢谢!我对上面的代码做了一个轻微的更新。我想使用保存在“d”中的所有数据并执行另一个操作(如上面编辑的代码中的乘法).Agree转换构造函数是一种方法…但这将迫使我编写一些函数,如“int getj(){return j;}”。除了不编写任何“get”函数之外,还有其他方法吗?当然有…定义一个“copy ctor”在B上,从E上的转换向量调用。在B的复制向量中,您的i和j可以直接复制,而不需要get函数。您能给我提供一个示例代码吗?非常感谢…谢谢您的回复
B* e = d;
 D *d = new D();
class DECommunicator
{
public:
  DECommunicator(D* dPtr, E* ePtr)
  {
    mDPtr = dPtr;
    mEPtr = ePtr;
  }

  void DSetI(int x)
  {
    mDPtr->setI(x);
  }

  // add additional methods to allow D to "talk" to E and vice versa

private:
  D* mDPtr;
  E* mEPtr;
}