gpt4 book ai didi

c++ - 正确的 OOP 设计,如果我想调用 const 引用的非 const 函数?

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

我想我还需要学习很多东西,不仅是 C++,还有面向对象编程本身。在最近的一个 C++ 项目中,我经常遇到一个问题:如果我想将 const 引用传递给某个对象,我该如何使用该对象的非 const 函数?

让我举个例子:例如,假设我有一个包含一些数据的类和一个使用该数据进行小计算的函数

class Person
{
private:
float weight;
float height;
float age;
...

public:
float bodyMassIndex();
};

现在我有另一个具有不同专业知识的类(class),例如

class GymInstructor
{
private:
float knowledge;
int age;
...

public:
int recommendDumbbellWeight(const Person &person);
};

现在假设函数 GymInstructor::recommendDumbbellWeight 想要在其计算中使用函数 Person::bodyMassIndex()

这是我应该避免或不能做的事情的列表:

  • recommendDumbbellWeight 中制作 Person 的本地拷贝(因此避免像 GymInstructor::recommendDumbbellWeight(Person person) 这样的东西)因为我这样做不需要,它会减慢我的程序
  • 通过类似 GymInstructor::recommendDumbbellWeight(Person *pPerson) 的方式提供指向 recommendDumbbellWeight 的指针,因为我只需要只读访问权限,因此应该通过以下方式避免任何错误授予对 recommendDumbbellWeight
  • 的写入权限
  • 将 Person::bodyMassIndex 设为 const 函数,因为它取决于对象的状态,例如体重高度
  • 将函数 bodyMassIndex() 移至其他类,因为它使用了 Person 的数据,所以没有真正的理由让另一个对象执行该计算.如果是这样,我将不得不将所有数据传递给另一个类。
  • 比如说,GymInstructor::recommendDumbbellWeight 需要更多的小计算结果,例如 Person::bodyMassIndex(),那么我也应该避免只传递使用类似 GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ... 的方法进行计算,因为它会破坏我的参数列表,看起来很难看并产生不必要的代码。

那么实际上还剩下什么?我很想在 GymInstructor::recommendDumbbellWeight(const Person &person) 中调用 Person::bodyMassIndex(),但我不能,因为 person 是一个常量引用。
我假设要么我太笨以至于看不到非常明显的解决方案,要么我的设计存在根本性的错误。我将如何解决我的问题?

最佳答案

声明一个方法 const 有点像 promise 它不会尝试修改对象。它不会拒绝您访问对象状态,您仍然可以完美地为非常量对象调用它。 所以是的,解决方案是 float bodyMassIndex() const;

关于c++ - 正确的 OOP 设计,如果我想调用 const 引用的非 const 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495898/

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