在 2 个 cpp 文件中定义一个 C++ 类?

Posted

技术标签:

【中文标题】在 2 个 cpp 文件中定义一个 C++ 类?【英文标题】:Define a C++ class in 2 cpp files? 【发布时间】:2014-04-22 11:20:34 【问题描述】:

我可以在 1 个头文件中声明我的类并在 2 个单独的 cpp 文件中定义它吗? (就像在 C# 中一样)主要原因是我减少了我现在拥有的单个文件中类定义的行数。顺便说一句,我所有的标题都是“包括受保护的”+“pragma onced”。

标头: "foo.h"

#pragma once

#ifndef FOO_H_2014_04_15_0941
#define FOO_H_2014_04_15_0941

class CFoo

public:
    int add(int a, int b);
    int sub(int a, int b);
;

#endif

来源: "foo.cpp"

#include "stadafx.h"
#include "foo.h"

int CFoo::add(int a, int b)

    return a + b;

"foo2.cpp"

#include "stadafx.h"
#include "foo.h"

int CFoo::sub(int a, int b)

    return a - b;

当我尝试时,在第二个 cpp 文件“无法打开源文件 stdafx.h”(也是“foo.h”)中出现编译器错误

【问题讨论】:

为了所有神圣的爱,请不要这样做。大多数 C++ 开发人员不会预料到这一点,并且它成为维护的噩梦。如果你的类太大需要 2 个文件,那么你需要修复你的设计,可能你需要更多的对象。 @paulm 实际上这不是我的设计,现在是我维护它。我想将含义不同的方法分开,也通过private / public分开。 【参考方案1】:

是的,你可以这样做。

stdafx.h 是一个预编译的头文件。这是 Visual Studio 的约定。为了优化编译,经常使用的头文件放在stdafx.h,然后你包含这个文件。关键是您必须#include "stdafx.h" 放在源文件的顶部。

您可以这样做,也可以禁用此 .cpp 文件的预编译标头使用。或者你的整个项目。

确保在 foo.h 文件中也使用包含保护。 @Theolodis 所说的一系列预处理器指令,或者#pragma once


我同意@paulm:像这样拆分你的实现只是表明你的设计有缺陷。这是“正确”的决定非常非常。您很可能应该考虑将代码分解为更小、更易于管理的组件。

【讨论】:

【参考方案2】:

在标题中添加:

#ifndef FOO_H_
#define FOO_H_

class CFoo

public:
    int add(int a, int b);
    int sub(int a, int b);


#endif

问题是您的头文件在可执行文件中包含两次,导致名称冲突。否则一切都很好,您甚至可以为每种方法获取一个.cpp 文件。

【讨论】:

我有包括警卫。 @mini-me 好吧,那么 tenfour 的回答应该可以解决您的问题。【参考方案3】:

首先,不要在同一个头文件中使用“include guarded”和“pragma onced”!仅使用“包含保护”!

其次,你必须在windows上开发,可能会使用visual studio。因为你使用了预编译的头文件:stdafx.h。你拼写错误!

只有这个!

【讨论】:

以上是关于在 2 个 cpp 文件中定义一个 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章

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

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

C++将模板的声明和定义放置在同一个头文件里

C++函数的分文件编写

C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

结构体 c++ 如何定义结构体 在1.cpp 中, 结构体变量值放在2.cpp, 在3.cpp中使用结构体?