C++中对象之间的通信

Communication between objects in C++

本文关键字:通信 之间 对象 C++      更新时间:2023-10-16

我有两个类A和B,定义如下:

class A
{
    public:
    void *connector;
};
class B
{
    public:
    void *connector1;
    void *connector2;
};

首先,让我们假设我基于这些类创建了三个对象 C1、C2 和 C3,

A C1;
B C2;
A C3;

我使用以下代码来连接它们

C1.connector = &C2;
C2.connector1 = &C1;
C2.connector2 = &C3;
C3.connector = &C2;

所以目前我有这个:C1 <-> C2 <-> C3(第一个例子)。

重要提示:我之所以在所有类中使用 void 指针,是因为我无法从一开始就预测对象将如何连接。例如,如果我创建第四个对象并建立这些连接(C1 和 C2 与以前相同),则此问题的答案应该是有效的:

B C3;    
A C4;
C1.connector = &C2;
C2.connector1 = &C1;
C2.connector2 = &C3;
C3.connector1 = &C2;
C3.connector2 = &C4;
C4.connector = &C3;

这对应于这个 C1 <-> C2 <-> C3 <-> C4(第二个示例)。

我到处尝试并寻找一个简单的解决方案来实现这些对象之间的通信。甚至有几个同名的问题,但我找不到所问的问题与我试图解决的问题的各自答案之间的相似之处。也许是因为我从一开始就没有正确处理这个问题。无论如何,我所说的通信是指 C2 可以在 C1 中调用方法的简单方法,反之亦然。

1)我尝试使用模板执行此操作,但无法弄清楚该怎么做。所有类都是模板,而且缝合确实是人为和复杂的(难以阅读,维护和实现)。

2)我尝试使用指针的转换,但由于我不知道它们连接到哪个类的开头,所以我无法做到这一点。

重要提示:虽然我不能保证连接,但我可以很好地接受这样一个事实,例如,类 B 的对象确切地知道它将在连接到其连接器的对象中执行的方法的名称。

为了清楚起见,让我们假设我们引入了一种方法

int get_value(); 

在 A 类和 B 类中(但每个类的实现都不同)。因此,在上面的第二个示例中,C2 可以在 C1 上调用它,C3 可以在 C2 上调用此方法。但请注意,C2 和 C3 是同一类的对象。

好的,现在我解释了我的问题,我想为这个问题的沟通要求一个简单的解决方案。例如,实现 C2 和 C1 之间以及 C3 和 C2 之间的通信的工作代码段(请参阅上面的示例 2)。

具体来说,我认为对象 C2/C3 可以在 C1/C2 中调用 get_value 方法的示例,以便 C2/C3 可以将值存储在私有/公共变量中将是完美的。

意识到我试图实现这一点的方式可能不是最好的,也欢迎以不同方法解决问题的答案。但如果可能的话,请给我看一些代码和一些解释,因为我的主要目标和专业知识不是编程技能。

提前非常感谢你。

基本上,void* 不是要走的路。

另一种方法是使用固有性:

class OBJ 
{
public:  
    virtual string getValue()=0; 
};
class A : public OBJ 
{
public:
    OBJ *connector;
    string getValue();
};
class B : public OBJ
{
public:
    OBJ *connector1;
    OBJ *connector2;
    string getValue();
};

然后,这些对象可以轻松地"通信"引用基 OBJ 类的公共成员。

C1.connector->getValue(); 
C1.connector->connector2->getValue(); 

解决此问题的典型方法是定义一个描述通信的接口类 - 可以执行的功能

// create an interface to communicate with
struct connected
{
    virtual ~connected() {} // must have virtual dtor
    virtual int get_value() = 0; // pure virtual functions
};
class A
: public connected // implement the connected interface
{
    int value;
public:
    A(int value = 0): value(value) {}
    // implement the connected interface
    int get_value() override { return value; }
    connected* connector = nullptr;
};
class B
: public connected // implement the connected interface
{
    int value;
public:
    B(int value = 0): value(value) {}
    // implement the connected interface
    int get_value() override { return value; }
    connected* connector1 = nullptr;
    connected* connector2 = nullptr;
};
int main()
{
    A C1;
    B C2;
    A C3;
    C1.connector = &C2;
    C2.connector1 = &C1;
    C2.connector2 = &C3;
    C3.connector = &C2;
    C2.connector1->get_value(); // use the connected interface
}

这是有效的,因为AB属于connected类型,因此他们只需要关心它们具有指向其他connected类型的指针这一事实,并且不需要关心它们是A还是B

我不知道你的确切需求,但也许你会阅读它可能会帮助你的观察者模式。或者,如果可以的话,也许您可以尝试使用Qt它有一个很好的siganl插槽机制。