这是我在头文件中创建的类的摘录:
typedef double real;
class Grid{
public :
explicit Grid ();
explicit Grid(size_t level );
Grid(const Grid & grid );
~ Grid ();
const Grid & operator =( const Grid & grid );
inline real & operator ()( size_t i , size_t j );
inline real operator ()( size_t i ,size_t j ) const;
void fill( real value );
void setBoundary ( real value );
private :
size_t y_ ; // number of rows
size_t x_ ; // number of columns
real h_ ; // mesh size
real * v_ ; // values
};
这里是我在单独的.cpp文件中为先前声明的函数编写的代码的摘录。请注意,我只包含与我的错误相关的部分。
inline real& Grid :: operator ()( size_t i , size_t j ){
if( (i >= y_) || (j>=x_ ) )
throw std::invalid_argument( "Index out of bounds" );
return v_ [i* x_ +j];
}
inline real Grid::operator ()( size_t i ,size_t j ) const{
if( (i >= y_) || (j>=x_ ) )
throw std::invalid_argument( "Index out of bounds" );
return v_[i* x_+j];
}
void Grid::fill( real value ){
for(size_t i=1;i<y_;++i){
for(size_t j=1;j<x_;++j)
v_(i,j)=value;
}
}
void Grid::setBoundary ( real value ){
size_t i = 0;
for(size_t j=0;j<x_;++j){
v_(i,j)=value;
}
i = y_;
for(size_t j=0;j<x_;++j){
v_(i,j)=value;
}
size_t j = 0;
for(size_t i=0;i<y_;++i){
v_(i,j)=value;
}
j = x_;
for(size_t i=0;i<y_;++i){
v_(i,j)=value;
}
}
我收到错误
((Grid*)this)->Grid::v_
不能用作函数
每当我尝试在()
和fill
函数中使用重载的setBoundary
运算符时。我曾尝试在线寻找类似的错误,但遗憾的是无法取得多大进展。你有任何建议,因为我认为重载运算符的实现是正确的,据我所知,我还没有命名任何与成员变量同名的函数。
答案 0 :(得分:3)
v_
是real*
,即指针。指针没有operator()
,因此您无法编写v_(something)
。
您为operator()
课程提供了Grid
的重载。如果要使用该重载,则需要在()
类的对象上使用Grind
。 v_
不是Grid
类的对象。
您可能想要在当前对象(即operator()
或fill
被调用的对象)上调用setBoundary
。要做到这一点,你要写(*this)(arguments)
。
答案 1 :(得分:3)
当您编写v_(i,j)
时,您没有调用重载的()
运算符。您应该尝试使用(*this)(i,j)
。