【问题标题】:How to use method of classes inside method of other class when argument is const reference?当参数是 const 引用时,如何在其他类的方法中使用类的方法?
【发布时间】:2017-03-28 15:43:11
【问题描述】:

我有一些方法mSkeleton

//mSkeleton Class
mSkeleton::mSkeleton( const double& M, const int& N){ 
mass = M;
nph = N;
}

double mSkeleton::getNph(){
  return nph;
}
...

我还有另一个类mizer 有一些方法:

void mizer::addMassSkeleton( const mSkeleton& mass ){
  masses.push_back( mass );
  count_external_phs += mass.getNph();
}

当我编译它时,我得到了错误:

mizer.C:46:24: error: member function 'getNph' not viable: 'this' argument has type
const mSkeleton', but function is not marked const
count_external_phs += mass.getNph();

如何解决这个问题?

【问题讨论】:

    标签: c++ class reference


    【解决方案1】:

    您需要将 getNph() 方法标记为 const,如下所示:

    double getNph() const; // in header file
    
    double mSkeleton::getNph() const { ... } // in .cpp
    

    这样使用const意味着getNph方法不会改变对象状态。

    默认情况下,所有方法都是非常量的。如果您没有将您的方法显式标记为 const,编译器会认为调用此方法会更改对象状态,您不应该这样做,因为您收到的 mass 对象为 const:void mizer::addMassSkeleton( const mSkeleton& mass ){

    【讨论】:

      【解决方案2】:

      您只需要将 mizer::addMassSkeleton(...) 标记为 const 方法。

      void mizer::addMassSkeleton(const mSkeleton& mass) const {
        masses.push_back( mass );
        count_external_phs += mass.getNph();
      }
      

      如果你有一个声明为 const 的方法,那么你在该函数中使用的所有类的方法也必须是 const,否则,作为你的 const 函数的非 const 函数可能会改变对象。更改对象会破坏“const”合同。

      正如 Roberto 在他对我的问题的评论中指出的那样,如果 'masses' 是 mizer 的成员变量,那么 addMassSkeleton 不能是 const。如果 mass 是一个全局对象,该函数仍然可以称为 const,但它可能会产生误导。

      【讨论】:

      • 我认为 addMassSkeleton 方法不应该是 const 因为它改变了“群众”成员。
      • 你是对的,除非群众不是 mizer 拥有的。
      【解决方案3】:

      一个 const 对象意味着你不能调用可能改变对象的方法,所以这一行:

      count_external_phs += mass.getNph();
      

      不能被调用,因为 mass 是 const,并且您想通过执行 getNph 来修改它,现在我确实意识到当您调用 getNph 时您实际上并不想修改对象 - 但编译器不知道.

      你可以修改代码并在方法上添加一个'const'关键字来标记它。

      double mSkeleton::getNph() const {
         return nph;
      }
      

      看看c++ const correctness

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 2017-06-25
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        相关资源
        最近更新 更多