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

C++ Setting a private class member with function after the object is initialized via a constructor

本文关键字:设置 函数 成员 构造函数 对象 初始化 C++      更新时间:2023-10-16

在用构造函数创建对象后,我正在尝试设置一个私有类成员。此构造函数设置了一组公共成员,但不涉及私有成员。

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

感谢您的帮助!

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

  • 定义setter函数
  • 或者改变对CCD_ 2的访问

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

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

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

先想想。为什么要违反封装和数据隐藏原则?有没有其他方法或设计可以让你不必破坏数据隐藏?