【问题标题】:In C++, how do I operate on values returned by a function that gives a pointer?在 C++ 中,如何对提供指针的函数返回的值进行操作?
【发布时间】:2013-11-20 11:07:45
【问题描述】:

用 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]

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

【问题讨论】:

  • 这并不完全清楚。 “整数坐标向量”不是“双精度向量”,所以我不确定让一个从另一个继承是否有意义。
  • 另外,请构造一个minimal test-case 来证明您的编译错误。
  • 我尝试修复代码的格式,但不确定是否正确,因为它缺少几个}。此外,当你throw时,你必须扔东西;当您想重新抛出捕获的异常时,您只能在 catch 子句中单独使用 throw;

标签: c++ function pointers inheritance virtual


【解决方案1】:

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

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

【讨论】:

  • 感谢您的反馈!正如我所描述的,在某些情况下 v 将是 vector,但是从此类继承的类将使用 vector,其坐标由其他地方的结构描述。这就是为什么我不得不使用指针而不是仅仅访问 v[index] 中的值。编辑:我应该补充一点,整数坐标是整数对,所以向量的每个元素都存储一对值。
猜你喜欢
  • 2014-08-16
  • 2018-03-07
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多