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
是aB
顺便说一下,您的问题标题是:
同一基类的两个派生对象如何通信
强调我的。你没有两个派生对象——你只有一个。有两个类,但你只实例化一个实际对象,如下所示:
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;
}