C++ 获取不同的实例进行通信

C++ 获取不同的实例进行通信,c++,object,C++,Object,假设我有两个同一类的实例。该类有一个指向某些数据的指针,我希望实例作为某个私有函数的算法的一部分交换指针,但不会因为通过公共函数直接访问而损害其他所有人的数据 我的第一个想法是添加一个名为exchange的bool类型的静态变量和两个方法:私有变量:void requestExchange()和公共变量:Data**respond()。 requestExchange会将exchange设置为true,然后会立即从所选实例中返回respond(),这将执行以下操作: if(exchange==t

假设我有两个同一类的实例。该类有一个指向某些数据的指针,我希望实例作为某个私有函数的算法的一部分交换指针,但不会因为通过公共函数直接访问而损害其他所有人的数据

我的第一个想法是添加一个名为exchange的bool类型的静态变量和两个方法:私有变量:void requestExchange()和公共变量:Data**respond()。 requestExchange会将exchange设置为true,然后会立即从所选实例中返回respond(),这将执行以下操作:

if(exchange==true){
    exchange=false;
    return data;
}
else{return...?!
这是当我意识到我无法模拟“无操作”时,因为数据实际上可能是空的,所以假设一切都是响应。有什么办法吗


更新:我考虑了一下,因为请求-响应组合将只在结果为NULL有意义的上下文中被调用(交换肯定是正确的),所以我想我可以简单地返回NULL并以这种方式模拟NO-OP。对于一个局外人来说,空作为结果将是无用的。。。但我仍然对建议感兴趣。必须有一种结构更完善的方法来实现这一点

同一类的对象可以直接访问彼此的私有数据。例如,您经常在复制构造函数中看到这一点。

您对问题的描述不是很清楚。为什么不能将respond()设为私有函数

有一个静态类成员的想法充满了危险。如果两对这样的实例想要同时通信呢?如果一个人设置了交换标志,然后在调用respond()之前就死了呢?线程安全性如何


至于返回不可操作或错误指示器,您可以使用异常(这就是它们的用途,但是如果您的项目不使用异常,那么突然引入它们不是一个好主意),或者采用boost::optional的方法。

最好将您对返回数据和交换数据的关注分开

class Foo
{
public:
   Bar* data()
   {
      return pData;
   }
private:
   void exchangeData(Foo& Rhs)
   {
      if (this != &Rhs)
      {
         Bar* pTmp = pData;
         pData = Rhs.pData;
         Rhs.pData = pTmp;
      }
   }
   Bar* pData;
}

希望这是你想要的?这个问题不是很清楚……

我可能没有抓住你问题的重点。为什么这不符合你的要求

class CMyClass  
{
public:
    void ExchangePointerWith( CMyClass& rhs );

private:
    void* m_MyPtr;
};
以及:

使用std::swap()并构建类自己的swap方法,这样您就知道它应该是异常安全的。swap()是大多数类应该实现的标准路由,以使它们对STL有效

请记住,类自动成为自己的朋友。因此,它可以访问同一类的另一个实例的私有成员变量。见()

#包括
类myX
{
公众:
无效掉期(myX和rhs)抛出()
{
标准::交换(数据,rhs.数据);
}
私人:
作废*数据;
};

发布更多代码,说明您对exchangeData()函数的疑问。我相信他主要关心的是您只能在私有上下文中进行交换。
void CMyClass::ExchangePointerWith(CMyClass &rhs)
{
    void*   tmp= m_MyPtr;
    m_MyPtr= rhs.m_MyPtr;
    rhs.m_MyPtr= tmp;
}
#include <algorithm>

class myX
{
    public:
        void swap(myX& rhs) throw()
        {
            std::swap(data,rhs.data);
        }
    private:
        void* data;
 };