0

用 C++ 编程,掌握继承。我的程序创建了一个类,然后创建了一个继承自第一个类的新类。第一个是双精度向量,第二个是整数坐标向量(定义为结构)。适用于父类的算法不适用于子类。为了解决这个问题,我一直在更改父类中的一些函数以使用内存地址而不是值,特别是方括号 [] 运算符,它返回向量中该条目的值(或者更确切地说,现在返回那个地址入口)。更改程序的后面部分以使用给定地址处的值,而不是立即期望一个值,这是行不通的,在广泛的谷歌搜索和笔记阅读之后,我无法弄清楚为什么。相关代码部分的示例如下:

方括号运算符

//access data in vector
double * operator[](int index) { 
  if(index<0) {
    cout<< "Index out of range" << endl;
    throw;
  }
  else if (index>v.size()-1) {
    cout<< "Index out of range" << endl;
    throw;
  }
  double *ptr = &v[index];
  return ptr;
}
//access data in vector (const)     
const double * operator[](int index) const {
  if(index<0) {
    cout<< "Index out of range" << endl;
    throw;
  }
  else if (index>v.size()-1) {
    cout<< "Index out of range" << endl;
    throw;
  }
  const double *ptr = &v[index];
  return ptr;
} 

以及使用上述运算符的功能之一

virtual bool comp(int i, int j) {
  if(*v[i]<*v[j]) {
    return true;
  }
  else
    return false;
}

我收到关于使用的错误

*v[i]<*v[j]

说 * 的运算符必须是一个指针,但我确信方括号函数正在返回一个指针。

4

1 回答 1

3

与您奇怪的界面不同,vector[]返回的是引用,而不是指针。因此,要比较向量元素,您只需要v[i] < v[j]. (假设vstd::vector<double>;您的描述和其他用途暗示就是这种情况,但您忘记包含确切的声明)。

顺便说一句,if (...) return true; else return false;将布尔表达式转换为完全相同的布尔值是没有意义的。return ...;更容易阅读。更一般地说,你应该把你的代码布局,使结构易于遵循;我的大脑开始融化,弄清楚它应该做什么。

于 2013-11-08T12:31:57.833 回答