C ++通过构造函数初始化对象后,使用函数设置私有类成员

时间:2015-03-03 01:11:07

标签: c++ function class reference member

我在使用构造函数创建对象后尝试设置私有类成员。这个构造函数设置了一堆公共成员,但是没有触及私有成员。

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()的内容时,我仍然发现它是空的,就像原始对象没有被修改一样。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

如果您想绕过private数据成员的访问权限,您必须:

  • 定义 setter 函数
  • 或更改对public的访问权限。

private背后的原因是阻止外部实体访问数据成员。

一种思想是提供改变变量的“setter”接口。这允许外部实体改变数据的方法。如果数据变为其他内容,接口仍然完好无损,但实现会发生变化;从而保存对使用该接口的所有实体的更改。

另一种思想是使数据成员public。这允许外部实体直接访问数据成员。如果数据成员更改,键入或位置,则直接访问它们的所有实体都需要更改。

首先考虑一下。为什么要违反封装和数据隐藏原则?是否有其他方法或设计,以便您不必破坏数据隐藏?