Visual编写一个c++程序,使用带有头文件的CPP文件

visual writing a c++ program using a cpp file with header file

本文关键字:文件 CPP 程序 c++ 一个 Visual      更新时间:2023-10-16

正在为我的大学项目写一个基本的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声明。

这使得程序可以正常工作:)

每次写

#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(读取它)将满足。


你需要阅读的摘要:

  • 声明/定义的区别
  • 什么是TU -翻译单位
  • 编译与链接的区别
  • 什么是ODR,为什么它很重要
  • #include指令做什么

头文件必须防止多个包含。

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

#ifndef TEST_CLASS_INCLUDE
#define TEST_CLASS_INCLUDE
class TestClass
{
...
};
#endif

同样,你不应该包含。cpp文件。只需要从Source.cpp中包含include TestClass.h,并确保TestClass.cpp已被编译,TestClass.cpp已被编译。

你需要仔细阅读链接

这条线

#include "TestClass.cpp"

不需要

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