首页 > 解决方案 > 我应该如何包含 C++ 类?

问题描述

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

我有一个 subdirs 项目,其中包含两个子项目,一个 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++ 编程非常陌生,有点困惑。非常感谢详细的帮助。

标签: c++qtqt-creator

解决方案


一旦您使用 CMake,您的问题就会得到解答,因此可能会有所帮助。

查找头文件和 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)

推荐阅读