【问题标题】:How should I include a C++ class?我应该如何包含 C++ 类?
【发布时间】:2019-09-07 20:43:53
【问题描述】:

我想在另一个项目中包含一个项目中的类。

我有一个子目录项目,其中包含两个子项目,一个 windows qt 控制台应用程序和一个用于测试控制台应用程序的自动测试项目。我的控制台应用程序包含一个类,我想将其拉入我的单元测试进行测试:

这是标题:

// calculator.h:
#ifndef CALCULATOR_H
#define CALCULATOR_H

class Calculator{

private:

public:
    Calculator(int year);

    int getYear(){ return 666; }
    int getMonth();
    int getDay();
};

#endif

来源:

// calculate.cpp
"#include "calculator.h"

Calculator::Calculator(int year){}

int Calculator::getMonth(){
    return 42;
}

int Calculator::getDay(){
    return 3333;
}

这是我的单元测试的样子:

//tst_foobar.cpp

#include <QtTest>
//#include "../Calculator/calculator.h"
#include "../Calculator/calculator.cpp"

// add necessary includes here

class Foobar : public QObject
{
    Q_OBJECT

private slots:
    void test_case1();
};

void Foobar::test_case1()
{
    Calculator myCalc(42);
}

QTEST_APPLESS_MAIN(Foobar)

#include "tst_foobar.moc"

我的问题是当我像这样包含另一个子目录的头文件时:#include "../Calculator/calculator.h" 它不能正常工作。我无法测试calculator.cpp 中定义的任何类函数。我可以像这样明确地包含 calculate.cpp #include "../Calculator/calculator.cpp" 并且我的测试按预期工作,但这是正确的方法吗?

我从未见过像这样的文件中包含.cpp 文件,只有标题?但是如果只包含头部,头部不包含calculator.cpp中的函数定义?我的头文件应该包含.cpp 文件吗?这样我就可以只在其他文件中包含标题,就像你在 C++ 中经常看到的那样。 那么为什么 QT Creator 生成的类会反其道而行之呢?创建一个头文件和一个.cpp文件,.cpp文件是包含头文件的那个??

对 C++ 编程非常陌生,有点困惑。非常感谢详细的帮助。

【问题讨论】:

  • 可能是转录错误,但是..."#include "calculator.h" 不应该有前面的"

标签: c++ qt qt-creator


【解决方案1】:

您的问题将在您使用 CMake 后立即得到解答,因此this 可能会有所帮助。

所有查找头文件和 cpp 文件的无聊部分都在 CMakeLists.txt 文件中完成。然后在你使用add_executable()时会创建一个可执行文件

请注意,您可能会创建一个“干净”的构建目录。

我认为您的 CMakeLists.txt 文件将类似于

cmake_minimum_required(VERSION 2.8.11)
project(your_project_name)

enable_testing()

# Tell CMake to run moc when necessary:
set(CMAKE_AUTOMOC ON)

# As moc files are generated in the binary dir, tell CMake
# to always look for includes there:
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Test REQUIRED)

add_executable(foo your_test.cpp your_src.cpp)
add_test(foo foo)

target_link_libraries(foo Qt5::Test)

【讨论】:

  • "sudirs project"(来自问题)暗示 OP 使用的是qmake,而不是 CMake。
【解决方案2】:

您实际上从不包含 cpp 文件。 如果包含 h 文件,您应该能够访问类中的对象。

【讨论】:

    【解决方案3】:

    当您包含一个 .h 文件时,它基本上是说复制 .h 文件中的内容并将其粘贴到 cpp 中。 calculator.h 包含在calculator.cpp 中,因此当程序编译时,它会同时创建包含cpp 和.h 的二进制文件。 cpp 文件被编译并链接在一起 .h 文件不会因为它们已经将使用 .cpp 进行编译。因此,就 main 而言,如果您包含 .cpp ,您只需要包含 .h 就不会有效。 **您在 main 中还包含 .h 的原因是程序将了解该类。我希望这能回答你的问题。 总结一下:在calculator.cpp和main中包含calculator.h。

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 2011-05-06
      • 2022-01-25
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2011-05-29
      • 2019-12-18
      • 1970-01-01
      相关资源
      最近更新 更多