【问题标题】:Unable to pass object by reference无法通过引用传递对象
【发布时间】:2013-11-12 19:04:42
【问题描述】:

我正在一个类中创建对象费用:

Expense exp(expense);

然后将其传递给另一个类(Category)作为参考:

vector<Category> *ptrCateg = &(impl->categories);
ptrCateg->at(pos).addNewExpense(exp);

这是我在 Category 类中收到它的方式:

void Category::addNewExpense(const Expense &exp){
   }

这是我在头文件中定义 addNewExpense 方法的方式:

void addNewExpense(const Expense &exp);

我无法弄清楚为什么会出现错误:void Category::**addExpense**(const Expense &amp;exp){。它说:“错误:声明与“void ExpenseManager::Category::addNewExpense(const &exp)”不兼容(在“mycomputerandsonon\Category.h”的第 29 行声明)。

我已经无休止地在谷歌上搜索,但我无法弄清楚哪里出了问题。我找到了一个通过引用传递对象的示例,但我得到了这个错误......

【问题讨论】:

  • 一个简单的、可编译的“main()”程序是个好主意。我怀疑类中方法“addExpense”的声明与类外的定义不一样。
  • “声明不兼容”消息中没有特定的 with 子文本,如“声明与 more-text-here 兼容”?
  • @WhozCraig 对此感到抱歉。完整描述:“错误:声明与“void ExpenseManager::Category::addNewExpense(const &exp)”不兼容(在“mycomputerandsonon\Category.h”的第 29 行声明)”
  • ExpenseManager 是一个简单的命名空间?或者它是一个封闭类? Expense 是同一个命名空间的一部分吗?该消息表明 Expense 不是同一个命名空间的一部分,但它在头文件中。
  • ExpenseManager 是一个简单的命名空间,Expense 是其中的一部分。

标签: c++ pointers reference constants


【解决方案1】:

在cmets提供的头文件中,声明Expense的文件不包含在Category.h中。您至少应该转发声明Expense(实际上,转发声明而不是不必要的包含以避免使编译变慢)。您可以通过在class Category {... 之前添加class Expense; 来实现。

【讨论】:

  • 不是真的,不是...我最近编辑了方法名称,并更新了 stackoverflow 中的信息(此处),我花了一些时间来编辑所有内容。对此感到抱歉。
  • @Fractal 现在我仔细阅读了问题是关于ExpenseExpense 声明是否包含在 Category.h 中? Category.h 中的声明是否在 ExpenseManager 命名空间内?
  • 感谢您的宝贵时间 :) 我相信,这是我的头文件:pastebin.com/j0A6nheT
  • @Fractal 声明 Expense 的文件未包含在 Category.h 中。您至少应该转发声明费用(实际上是转发声明而不是不必要的包含)。您可以通过在class Category {... 之前添加class Expense; 来做到这一点。
  • 我是唯一一个想知道// other includes实际上包括的人吗?
猜你喜欢
  • 2013-11-24
  • 2012-05-20
  • 2017-09-11
  • 2011-07-06
  • 2012-07-07
  • 2012-01-05
  • 2012-07-16
  • 2011-05-11
相关资源
最近更新 更多