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

时间:2014-04-22 11:20:34

标签: c++ oop visual-c++

我可以在1个头文件中声明我的类,并在2个独立的cpp文件中定义吗? (就像在C#中一样)
主要原因是我在现在的单个文件中减少了我的类定义的行数。顺便说一句,我所有的标题都是"包括看守#34; +" 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文件中出现编译错误时#34;无法打开源文件stdafx.h" (也" foo.h")

3 个答案:

答案 0 :(得分:5)

是的,你可以这样做。

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

您可以执行此操作,也可以禁用此.cpp文件的预编译标头使用情况。或者你的整个项目。

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


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

答案 1 :(得分:2)

在标题中,添加:

#ifndef FOO_H_
#define FOO_H_

class CFoo
{
public:
    int add(int a, int b);
    int sub(int a, int b);
}

#endif

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

答案 2 :(得分:0)

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

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

只有这个!