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

时间:2016-09-14 16:55:41

标签: c++ oop reference const

我想我不仅要学习很多关于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提供写访问来避免任何错误
  • 使Person :: bodyMassIndex成为const函数,因为它取决于对象的状态,例如weightheight
  • 将函数bodyMassIndex()移动到其他类,因为它使用Person的数据,因此没有其他对象应该执行该计算的真正原因。如果是这样,我将不得不将所有数据传递给其他类。
  • 说,GymInstructor::recommendDumbbellWeight需要更多的小计算结果,例如Person::bodyMassIndex(),那么我也应该避免将计算结果与GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ...一样传递,因为它会炸毁我的参数列表看起来很难看并产生不必要的代码。

那么实际上还剩下什么?我很想在Person::bodyMassIndex()中致电GymInstructor::recommendDumbbellWeight(const Person &person),但我不能,因为person是const引用。
我认为,要么是非常愚蠢,要么看到非常明显的解决方案,要么我的设计中存在根本性的错误。我怎么解决我的问题?

3 个答案:

答案 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成为一个错误。课堂设计中的一个错误。