2009-04-22 50 views
1

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

我的第一个想法是添加一个名为exchange的类型为bool的静态变量,以及两个方法:私有的:void requestExchange()和公共的:Data ** respond()。 requestExchange将设置交换为true,并且将紧接着从选择的实例响应(),这将做到以下几点:

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

这是当我意识到我没有模拟的方式“NO OP“,因为数据实际上可能是NULL,所以所有事情都会作为响应。任何想法可以做什么?

更新:我想了一下,因为请求响应组合将只在上下文中调用,其结果NULL将是有意义的(交换是肯定是真的),我想我可以简单地返回NULL和以这种方式模拟NO OP。对于局外人而言,NULL是无用的......但我仍然对建议感兴趣。这样做必须有一个更有条理的方式。

+0

发布更多的代码,说明你是问关于 – 2009-04-22 12:56:37

回答

3

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

+0

*脸手掌* OK谢谢...我想我对C++的记忆比我想象的更糟糕。 – 2009-04-22 13:01:24

0

你对问题的描述不是很清楚。为什么你不能只是作出回应()一个私人功能?

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

至于返回NO-OP或错误指示符,您可以使用异常(这是他们的目的,但如果您的项目没有使用异常,突然引入它们不是一个好主意),或者去路由boost :: optional。

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

希望它是沿着你想要的?问题是不是很清楚....

+0

exchangeData()函数可以是公共的。 – TonJ 2009-04-22 13:08:51

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

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

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

#include <algorithm> 

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