2016-03-15 67 views
0

我对C++的很多领域还是一个新鲜的东西,其中一个就是一般的.cpp和.h文件组织。有没有办法定义在单独的.h和.cpp文件中的名称空间中声明的函数?

我正在用一些结构和函数创建一个名称空间。我想宣布在.h文件中function.h与此类似

//objectname.h 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

声明的命名空间

//function.h 
//includes declarations used in the function definition as well 
//as possibly a redundant function declaration. 
Object Function(arguments); 

然后在function.cpp定义

//function.cpp 
#include "Function.h" 
Object Function(arguments) 
{ 
    .... 
} 

使您可以抽象地看到objectname.h中的名称空间,函数function.h中的特定声明和function.cpp.中的函数定义一如往常,任何s uggestions非常感谢。 (也基于Windows的c + +)

+0

也为此证明一些原因,是这样的。这些方法相当长,只是解析数据。我认为在命名空间中为每个方法配置一个.h/.cpp对是合适的。对于一般的文件保存,以该方法命名该文件。 –

+1

对于函数,使用名称空间的范围映射非常类似于对类进行范围映射,特别是'静态'类函数。换句话说,您需要实际指定命名空间范围。 –

+0

所以我需要对'function.h'和'function.cpp'文件进行修改?我是否应该使用完全限定名称在相应的文件中声明/定义它们?就像在'function.h'' Object ObjectName :: Function(arguments);'? –

回答

2

这是罚款

//objectname.h 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

你不需要function.h可言。如果你想命名空间分割成几个文件,你会做这样的:

//function.h 
//includes declarations used in the function definition as well 
//as possibly a redundant function declaration. 
namespace ObjectName 
{ 
    Object Function(arguments); 
} 

换句话说,你需要重新包装命名空间中的声明。 (这是一个进步的话题我不会做它。)

Function.cpp只需说功能是定义:

//function.cpp 
#include "ObjectName.h" 
Object ObjectName::Function(arguments) 
{ 
    .... 
} 

注意,语句中使用头文件是#include,而不是using

+0

好的,这个工程。我可以格式化该项目,因为我想拥有一个单独的(但冗余的)文件。正如我所说的,其原因仅仅是通过对称性使用类似的函数声明来简化我的操作,即使它本身并不需要它。基本上每个对象在项目中都有一个.h和.cpp文件(除了名称空间,没有.cpp)。 –

0

这不是它是如何工作的:你的function.h在全局命名空间中定义了另一个Function。具有两个具有相同名称的函数正是命名空间的用途 - 如果在任何其他库中已经存在Function,则库写入不需要担心。

并且由于您的.cpp仅定义了两个Function之一,另一个未定义,因此在调用时会出现链接错误。

请注意,您不需要一次性“定义”一个名称空间。以例如namespace std为例,其内容在例如<vector>,<list><iostream>。这是可能的,因为与类不同,名称空间可以重新打开。 namespace N { int x; } namespace N { int y; }有效。

+0

好吧,但如果我想保留一个.h文件与所有声明在一个地方,我可以使用#pragma一次?还有关于头文件和.cpp中的定义和声明? –

+0

@marshalcraft:'#pragma once'是一个头部守卫的不可移植替代品,而不是让你的代码突然有另一种含义的魔术。至于.cpp文件中的头文件和定义中的声明,是的,这仍然完全适用。 – MSalters

相关问题