获得不同的实例进行沟通

时间:2009-04-22 12:28:25

标签: c++ object

假设我有两个相同类的实例。该类有一个指向某些数据的指针,我希望实例将指针作为某个私有函数算法的一部分进行交换,但不要通过公共函数直接访问它来将数据泄露给其他人。

我的第一个想法是添加一个名为exchange的bool类型的静态变量,以及两个方法:private one:void requestExchange()和public one:Data ** respond()。 requestExchange会将exchange设置为true,并且会立即跟随所选实例的respond(),它将执行以下操作:

if(exchange==true){
    exchange=false;
    return data;
}
else{return...?!

当我意识到我无法模拟“NO OP”时,因为数据实际上可能是NULL,所以假设一切都作为响应。关于可以做什么的任何想法?

更新:我想了一下,因为请求响应组合只会在结果为NULL的上下文中被调用(交换肯定是真的)我想我可以简单地返回NULL并模拟这样一个NO OP。对一个局外人来说NULL就没用了......但我仍然对建议感兴趣。必须有一个更有条理的方式来做到这一点。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您对问题的描述不是很清楚。为什么你不能让response()成为私有函数?

静态类成员的想法充满了危险。如果两对这样的实例想要同时通信怎么办?如果设置交换标志然后在调用respond()之前死掉怎么办?线程安全怎么样?

至于返回NO-OP或错误指示符,您可以使用异常(这就是它们的用途,但如果您的项目不使用异常,那么突然引入它们并不是一个好主意),或者走路升压::可选的。

答案 2 :(得分:0)

最好将您的问题与返回数据和交换数据分开。

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

希望这与你想要的一致?问题不是很明确......

答案 3 :(得分:0)

我可能错过了你的问题。为什么这不符合你的要求?

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

private:
    void* m_MyPtr;
};

void CMyClass::ExchangePointerWith(CMyClass &rhs)
{
    void*   tmp= m_MyPtr;
    m_MyPtr= rhs.m_MyPtr;
    rhs.m_MyPtr= tmp;
}

答案 4 :(得分:0)

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

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

#include <algorithm>

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