使用带有头文件的 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
中的constructor
和destructor
声明。
这使程序运行良好:)
【问题讨论】:
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++ 程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Dev-C++5.11 在 C++ 程序中编译的错误文件