试着为我的大学项目写一个基本的c ++程序
我声明了一个名为TestClass
的示例类,并将其放在testclass.h
文件夹中的header files
文件中。
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的评论,我能够编译该程序。
另外,我必须删除constructor
中的destructor
和header file
声明。
这使程序运行良好:)
答案 0 :(得分:2)
每次写作
#include "something"
就像将“某事”文件的内容复制粘贴到该特定位置一样。
您正在编写“TestClass
”翻译单元和“Source
”翻译单元,其中包含compute
方法的定义。
删除Source.cpp中的cpp include:
#include "TestClass.h"
// #include "TestClass.cpp" <- Remove this
void main()
{
TestClass TObject = TestClass();
TObject.get();
}
并且Source
翻译单位会知道TestClass
有compute
方法,但ODR(读起来)将会得到满足。
您需要阅读的内容摘要:
#include
指令做什么答案 1 :(得分:1)
必须保护头文件免受多重包含。
在您的标头文件顶部添加#pragma once
,或将其更改为:
#ifndef TEST_CLASS_INCLUDE
#define TEST_CLASS_INCLUDE
class TestClass
{
...
};
#endif
此外,您不应该包含.cpp文件。只需在Source.cpp中包含include TestClass.h,并确保编译TestClass.cpp并链接TestClass.o。
让
答案 2 :(得分:0)
您需要阅读链接
这一行
#include "TestClass.cpp"
不是必需的
答案 3 :(得分:0)
您要包含TestClass.cpp
,您只需要包含头文件