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

时间:2014-07-26 14:15:21

标签: c++ visual-c++ visual-studio-2012 c++builder

试着为我的大学项目写一个基本的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中的destructorheader file声明。

这使程序运行良好:)

4 个答案:

答案 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翻译单位会知道TestClasscompute方法,但ODR(读起来)将会得到满足。


您需要阅读的内容摘要:

  • 声明/定义之间的区别
  • 什么是TU - 翻译单位
  • 编译和链接之间的区别
  • 什么是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,您只需要包含头文件