返回带有const getter函数的成员对象,但它是可修改的
Returning member object with a getter function as const but it is modifiable
我有一个类,它的私有成员是一个对象,我已经设置了一个相应的getter:
class lepton {
private:
TLorentzVector _p;
...
public:
...
const TLorentzVector& p() const { return _p; }
};
和TLorentzVector类当然有它自己的函数和变量,例如,假设SetStuff(...)
是一个函数。我们还假设SetStuff(...)
修改了对象的私有变量。我的程序允许我调用
....
lepton foo;
foo.p().SetStuff(...);
....
我想知道这是怎么可能的,因为getter p()
是const。使用允许修改类成员的getter是一种不好的方式吗?我最终采用了这种设置,因为在程序的另一点上,我想添加两个对象的_p
(TLorentzVector对象)变量,如下所示:
lepton lep1;
lepton lep2;
....
auto combined_four_vector = lep1.p() + lep2.p();
....
如果轻子类中的getter定义为:
TLorentzVector& p() { return _p; }
我不能添加TLorentzVector对象。
你可以定义一个非常量重载和一个常量重载(除非你有任何理由不定义非常量重载):
class lepton {
// ...
public:
// ...
TLorentzVector const& p() const { return _p; }
TLorentzVector& p() { return _p; }
};
这样,对于接受lepton const&
的函数和操作符,只有const
重载可用,从而保持对象的const安全。
例如,下面的命令可以正常工作:
lepton foo;
foo.p().SetStuff(...);
,假设在TLorentzVector const&
上定义了operator+
,下面也可以正常工作:
auto res = lep1.p() + lep2.p();
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++是否有定义的方法来传递指向类的成员对象的成员函数的指针
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 声明成员对象而不调用其默认构造函数
- 使用 QtConcurrent::run() 修改成员变量?
- 指向成员对象的指针 - 中断线程
- C++ API:修改内部对象
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 应该在成员对象上调用析构函数
- 修改类 c++ 中的成员对象
- C++ 可以修改 const 对象的成员
- C++是修改这些对象的向量中所有对象的给定成员的最佳方法
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 在析构函数中修改类成员对象会导致未定义的行为吗?
- 为什么在C++允许从外部修改常量对象的指针成员变量的内存?
- 使用指针从一个c++对象,到另一个c++对象,修改成员变量,从Lua
- 多个线程可以通过调用c++对象的相同方法来修改该对象的相同私有成员吗?
- 返回带有const getter函数的成员对象,但它是可修改的