我的课程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();
}
如何解决这个问题?
答案 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;
}