我在使用构造函数创建对象后尝试设置私有类成员。这个构造函数设置了一堆公共成员,但是没有触及私有成员。
class Tower {
std::vector<Tower> jtowers;
public:
Double_t E;
Double_t Et;
void SetJTowers( std::vector<Tower> );
std::vector<Tower> GetJTowers() { return jtowers; }
Tower ();
Tower (TLorentzVector,std::vector<Double_t>); //For jTowers
Tower (TLorentzVector,std::vector<Double_t>,std::pair<bool,bool>); //For gTowers
Tower (TLorentzVector,std::vector<Double_t>,std::pair<bool,bool>,std::vector<Tower>); //For seed gTowers
};
构造函数如下所示:
Tower::Tower (TLorentzVector FourVec,
std::vector<Double_t> otherTowerInfo,
std::pair<bool,bool> SeedRho_info) {
E = FourVec.E();
Et = FourVec.Et();
};
void Tower::SetJTowers (std::vector<Tower> constJTowers) {
jtowers = constJTowers;
};
然后我调用一个函数来接受对Tower对象的引用,做一些有趣的事情,然后尝试设置jtowers成员。
void AngularResolution :: ConstituentJTowers ( Tower& gT ) {
// Find constituent jTowers
std::vector<Tower> constJTowers;
// code to fill constJTowers
std::cout << constJTowers.size() << std::endl; // This will a nonzero size
gT.SetJTowers(constJTowers);
std::cout << gT.GetJTowers().size() << std::endl; // As will this
}
但是当我稍后在我的代码中尝试检查gT.GetJTowers()的内容时,我仍然发现它是空的,就像原始对象没有被修改一样。
感谢任何帮助!
答案 0 :(得分:0)
如果您想绕过private
数据成员的访问权限,您必须:
public
的访问权限。 private
背后的原因是阻止外部实体访问数据成员。
一种思想是提供改变变量的“setter”接口。这允许外部实体改变数据的方法。如果数据变为其他内容,接口仍然完好无损,但实现会发生变化;从而保存对使用该接口的所有实体的更改。
另一种思想是使数据成员public
。这允许外部实体直接访问数据成员。如果数据成员更改,键入或位置,则直接访问它们的所有实体都需要更改。
首先考虑一下。为什么要违反封装和数据隐藏原则?是否有其他方法或设计,以便您不必破坏数据隐藏?