当参数是const引用时,如何在其他类的方法内使用类的方法?

时间:2017-03-28 15:43:12

标签: c++ class reference

我的课程import pandas as pd import numpy as np #create random data and a pd.df np.random.seed(12345) df = pd.DataFrame([np.random.normal(33500,150000,3650), np.random.normal(41000,90000,3650), np.random.normal(41000,120000,3650), np.random.normal(48000,55000,3650)], index=[1992,1993,1994,1995]) #mean values for bars df['Mean'] = df.mean(axis=1).tolist() #confidence intervals from scipy.stats import sem yerr=df.T.sem().values*1.96 yerr %matplotlib notebook import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as col #plot variables x = df.index.values y = (df['Mean']) #title, labels and bars plt.title('Easiest') labels = ['1992', '1993', '1994', '1995'] plt.xticks(x, labels) plt.bar(x, y, width=1, edgecolor='k') #errorbar plt.errorbar(x, y, yerr, capsize=12, ls='none', color='black', elinewidth=1.2, label='_nolegend_') plt.axhline(y=39650, xmin=0, xmax=1, linewidth=1, color = 'gray', label='39,650') #colormap import matplotlib.colors as col import matplotlib.cm as cm norm = col.Normalize(vmin = (39650), vmax = (35650)) cm1 = cm.ScalarMappable(norm=True, cmap='RdBu') plt.legend() plt.show() 有一些方法:

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();
}

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您需要将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 ){

答案 1 :(得分: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在我对我的问题的评论中所指出的,如果'mass'是mizer的成员变量,则addMassSkeleton不能是const。如果mass是一个全局对象,那么该函数仍然可以被称为const,但它可能会产生误导。

答案 2 :(得分:1)

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

count_external_phs += mass.getNph();

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

您可以修改代码并在方法上添加'const'关键字以将其标记为const。

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

还可以查看c++ const correctness