使用带有头文件的 cpp 文件编写 C++ 程序

Posted

技术标签:

【中文标题】使用带有头文件的 cpp 文件编写 C++ 程序【英文标题】:writing a c++ program using a cpp file with header file 【发布时间】:2014-07-26 14:15:20 【问题描述】:

只是想为我的大学项目编写一个基本的 c++ 程序

我声明了一个名为TestClass 的示例类,并将它放在header files 文件夹中的testclass.h 文件中。

class TestClass

private:
    int an;
public:
    TestClass(void);
    int a[];
    void print();
    void compute();
    void get();
    ~TestClass(void);
;

然后到implement上面这个类,我在Source Files文件夹下新建了一个文件,然后写了这段代码。

#include <iostream>
#include <conio.h>
#include "TestClass.h"



    TestClass:: vinayak(void)
    

    

    void TestClass:: print()
    

    
    void TestClass:: compute()
    

    
    void TestClass:: get()
    

    

    TestClass:: ~TestClass(void)
    

    

然后我创建了一个名为Source.cpp 的新文件,然后编写了这段代码。

#include "TestClass.h"
#include "TestClass.cpp"

void main()

    TestClass TObject = TestClass();
    TObject.get();


我收到如下错误:

public: void __thiscall TestClass::compute(void)" already defined in Source.obj

有什么想法吗?

编辑:

根据@Marco 的评论,我能够编译该程序。 另外,我必须删除header file 中的constructordestructor 声明。

这使程序运行良好:)

【问题讨论】:

int a[]; 在类定义中是非法的 如果您使用的是 C++Builder,那么将变量命名为 TObject 以外的名称是明智的,因为它将该名称用于基本对象。例如使用以小写字母开头的变量名。 @MattMcNabb:谢谢 :) 我从来不知道.. 【参考方案1】:

每次写作

#include "something"

这就像将“某物”文件的内容复制粘贴到特定位置。

您正在编译一个“TestClass”翻译单元和一个“Source”翻译单元,它们都包含您的compute 方法的定义。

删除 Source.cpp 中包含的 cpp:

#include "TestClass.h"
// #include "TestClass.cpp" <- Remove this

void main()

    TestClass TObject = TestClass();
    TObject.get();


并且Source 翻译单元会知道TestClass 有一个compute 方法,但是ODR(阅读它)会得到满足。


您需要阅读的内容摘要:

声明/定义的区别 什么是 TU - 翻译单元 编译和链接的区别 什么是 ODR 及其重要性 #include 指令有什么作用

【讨论】:

答:谢谢马可。我删除了redefinition,一切都很好。再次感谢:)【参考方案2】:

必须防止头文件被多次包含。

在您的头文件顶部添加#pragma once,或将其更改为:

#ifndef TEST_CLASS_INCLUDE
#define TEST_CLASS_INCLUDE
class TestClass

...
;
#endif

此外,您永远不应包含 .cpp 文件。只需包含来自 Source.cpp 的 TestClass.h 并确保 TestClass.cpp 已编译且 TestClass.o 已链接。

【讨论】:

谢谢。正如你所说,我已经包含了#pragma once。再次感谢。 upvote 的声誉不够 :( 但再次感谢【参考方案3】:

你需要阅读链接

这一行

#include "TestClass.cpp"

不需要

【讨论】:

【参考方案4】:

你包含TestClass.cpp,你只需要包含头文件

【讨论】:

以上是关于使用带有头文件的 cpp 文件编写 C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏 C++ 头文件中的函数

使用 Dev-C++5.11 在 C++ 程序中编译的错误文件

C++头文件和cpp文件的原理

使用头文件编译 C++ 程序时出错:体系结构 x86_64 的未定义符号

C++中头文件设计

C++头文件和cpp文件的原理