gpt4 book ai didi

c++ - 返回带有 getter 函数的成员对象作为 const 但它是可修改的

转载 作者:行者123 更新时间:2023-11-30 02:38:59 25 4
gpt4 key购买 nike

我有一个类,它有一个私有(private)成员,它是一个对象,我已经设置了一个相应的 getter:

class lepton {
private:
TLorentzVector _p;
...

public:
...
const TLorentzVector& p() const { return _p; }
};

TLorentzVector 类当然有自己的函数和变量,例如,假设 SetStuff(...) 是一个函数。我们还假设 SetStuff(...) 修改了对象的私有(private)变量。我的程序允许我调用:

....
lepton foo;
foo.p().SetStuff(...);
....

我想知道这怎么可能,因为 getter p() 是常量。这是一个允许修改类成员的 setter/getter 的坏方法吗?我结束了这个设置,因为在我的程序的另一点我想添加两个对象的 _p (TLorentzVector 对象)变量,如下所示:

lepton lep1;
lepton lep2;
....
auto combined_four_vector = lep1.p() + lep2.p();
....

如果我只是将 lepton 类中的 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();

关于c++ - 返回带有 getter 函数的成员对象作为 const 但它是可修改的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com