假设我有两个相同类的实例。该类有一个指向某些数据的指针,我希望实例将指针作为某个私有函数算法的一部分进行交换,但不要通过公共函数直接访问它来将数据泄露给其他人。
我的第一个想法是添加一个名为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就没用了......但我仍然对建议感兴趣。必须有一个更有条理的方式来做到这一点。
答案 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;
};