【问题标题】:Undefined reference error at class instantiation类实例化时未定义的引用错误
【发布时间】:2013-05-24 21:15:16
【问题描述】:

这是我的 ma​​in.cpp。我的程序从这里开始,这就是我遇到问题的地方:

我收到两个错误:

第 23 行对 `BankController::BankController(TransactionRepository)* 的未定义引用

在第 19 行对 `TransactionFileRepository::TransactionFileRepository(std::string) 的未定义引用

对于他们来说,类型都是C/C++ 问题,资源是main.cpp

#include "bankgui.h"
#include "Controller/BankController.h"
#include "Repository/TransactionFileRepository.h"
#include "Repository/TransactionMemoryRepository.h"
#include "Repository/TransactionRepository.h"

#include <QtGui>
#include <QApplication>
#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]){

  string path = "DataStorage/Database.txt";

  //Instantiate the main data repository
  TransactionRepository* mainDatabase;
  mainDatabase = new TransactionFileRepository(path); // <-- Error here

  //Instantiate the main controller
  BankController* mainController;
  mainController = new BankController(mainDatabase); // <-- Same Error here

  //Starts the GUI
  QApplication app(argc, argv);
  BankGUI* mainWidget;
  mainWidget = new BankGUI(mainController);
  mainWidget->show();

  return app.exec();
}

我有 3 个课程:

  • 一个虚拟的TransactionRepository

  • 一个实现上述TransactionMemoryRepository

  • 的类
  • 将上述TransactionMemoryRepository继承到TransactionFileRepository

  • 的类

我已经在谷歌上搜索了几个小时的解决方案,但我尝试的一切都无法消除这些错误。

我应该提到这是我正在从事的 C++ QT 项目。我必须在项目属性中添加包含路径才能使某些事情起作用。

#included 的所有文件都存在。

【问题讨论】:

标签: c++ eclipse qt oop


【解决方案1】:

这是一个链接器错误。这意味着程序的各个部分(不同的 .cpp 文件)已成功编译,但现在链接器无法弄清楚如何将它们组合在一起。

就像你必须使用 #includes (of .h files) 来告诉编译器一个函数是在不同的文件中定义的一样,你需要给链接器提供参数,这样他就可以使用编译的文件(那些从.cpp) 来查找这些函数

编译过程在这个question的回答中有描述。

【讨论】:

  • 虽然我使用的是用于 C++ 的 Eclipse IDE,但使用的是 QT 项目工作区。我知道链接过程是由 IDE 自动完成的。我必须以某种方式进行设置吗?
  • 我没有为 C++ 设置 Eclipse,所以我不能确定,但​​这个:stackoverflow.com/questions/8480013/… 看起来不错。我确实觉得项目中的文件没有链接很奇怪,很难。也许你在设置时犯了一个错误。
  • 我不认为我知道如何设置它。我添加了一些库路径,仅此而已。制作 QT 项目肯定有一些不同的机制。例如,如果我右击我的 Project->Properties,那里的一切看起来都与我过去制作的标准 cpp 项目不同。
  • @Loop Qt 还有一些它使用的其他编译器/预处理器:mocuicrcc;这是您将看到的主要工具包差异。此外,我认为你应该放弃 Eclipse,除了一般来说 C++ 是垃圾(我认为必须专业使用它多年),Qt Creator 使得在项目方面使用 Qt much 更容易。
  • @cmannett85 是的,这是个问题。我从这个项目中得到了我的成绩,一个要求是使用 Eclipse 而不是 QT Creator(我认为因为 QTC 具有教师远离的拖放功能)
【解决方案2】:

找到问题了。

显然我处理 QT 链接过程的 .pro 文件不是最新的。我在里面的 HEADERS/SOURCES 属性中缺少 .header 文件。因此,他们没有使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多