我想我不仅要学习很多关于C ++的知识,还要学习面向对象的编程本身。在最近的一个C ++项目中,我非常频繁地遇到了一个问题:如果我想要将const引用传递给某个对象,我该如何使用该对象的非const函数?
让我举一个例子:假设我有一个带有一些数据的类和一个带有该数据的小计算的函数,例如
class Person
{
private:
float weight;
float height;
float age;
...
public:
float bodyMassIndex();
};
现在我有另一个具有不同专业知识的课程,例如
class GymInstructor
{
private:
float knowledge;
int age;
...
public:
int recommendDumbbellWeight(const Person &person);
};
现在说函数GymInstructor::recommendDumbbellWeight
想要在其计算中使用函数Person::bodyMassIndex()
。
以下列出了我应该避免或不能做的事情:
Person
内制作recommendDumbbellWeight
的本地副本(因此请避免GymInstructor::recommendDumbbellWeight(Person person)
之类的内容),因为我不需要这样做会减慢我的程序recommendDumbbellWeight
之类的东西给GymInstructor::recommendDumbbellWeight(Person *pPerson)
指针,因为我只是只读访问权限,因此应该通过对recommendDumbbellWeight
提供写访问来避免任何错误const
函数,因为它取决于对象的状态,例如weight
和height
。 bodyMassIndex()
移动到其他类,因为它使用Person
的数据,因此没有其他对象应该执行该计算的真正原因。如果是这样,我将不得不将所有数据传递给其他类。 GymInstructor::recommendDumbbellWeight
需要更多的小计算结果,例如Person::bodyMassIndex()
,那么我也应该避免将计算结果与GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ...
一样传递,因为它会炸毁我的参数列表看起来很难看并产生不必要的代码。那么实际上还剩下什么?我很想在Person::bodyMassIndex()
中致电GymInstructor::recommendDumbbellWeight(const Person &person)
,但我不能,因为person
是const引用。
我认为,要么是非常愚蠢,要么看到非常明显的解决方案,要么我的设计中存在根本性的错误。我怎么解决我的问题?
答案 0 :(得分:3)
声明方法const
有点像承诺它不会尝试修改对象。它不会拒绝您访问对象状态,您仍然可以完全调用非const对象。
是的,解决方案是float bodyMassIndex() const;
答案 1 :(得分:0)
将方法声明为const,因为它无论如何都是一个getter
float bodyMassIndex() const;
答案 2 :(得分:0)
Person::bodyMassIndex()
不应该是const的要求是不合理的,而且非常荒谬。
Person::bodyMassIndex()
不应该是const的唯一参数是它实际上更改了Person对象的状态。它没有。
首先让Person::bodyMassIndex()
非const成为一个错误。课堂设计中的一个错误。