我正在做一个C++项目。
我有一个类及其函数,然后我意识到其中一些函数与该类无关,而只是数学函数,所以我决定将它们转移到一个名称空间中。
我的第一个问题是,c++名称空间的适当文件扩展名是什么?
我有一个constants.h文件,我计划在其中保存全局常量,例如PI。
现在:
#include <math.h>
const double PI = M_PI;我有之前提到过的名称空间,现在名为:SpeciicMath.h
#include <stdlib.h>
#include "constants.h"
... more code我有一个gaussian.cpp:
#include "gaussian.h"
#include "specificMath.h"
#include <iostream>
... more code这个文件包含一个main函数,它现在什么都不做,如果没有main函数,我就不能编译整个项目。
我有一个gaussian.h,其中我没有包括任何东西,这是错的吗?
第三个类,没有属性,只有方法(同样,这是错误的吗?或者不漂亮?)。truncatedFunctions.cpp
#include "specificMath.h"
#include <stdlib.h>
#include "truncatedFunctions.h"
#include "gaussian.h"
using namespace specificMath;和它的truncatedFunctions.h,在这里,我再一次没有包含任何东西。
和第四个类,我在其中包含
#include "margin.h" //Its header, where I'm not including anything
#include "gaussian.h"
#include "specificMath.h"
using namespace specificMath;当我“创建”它时,它似乎编译得很好,但是当它转到链接部分时,我得到了很多错误,说我的margin.cpp类上的东西首先是在truncatedFunctions.cpp中定义的
我快要发疯了。我不知道为什么会发生这种情况,也不知道如何解决它。我将非常感谢,如果有人可以帮助我,请,任何额外的建议将是伟大的,因为我真的试图学习尽可能多的与这个项目。谢谢!
发布于 2012-02-13 02:30:51
当我“创建”它时,它似乎编译得很好,但是当它转到链接部分时,我得到了很多错误,说我的margin.cpp类上的东西是首先在truncatedFunctions.cpp中定义的
您是否在特定的Math.h中定义了您的函数?您应该只声明这些函数。
例如,如果您的SpeciicMath.h包含如下函数定义
#ifndef COOL_STUFF_NSPC
#define COOL_STUFF_NSPC
#include <iostream>
namespace coolstuff{
void print(void){std::cout << "I'm declared in a header file." << std::endl;
}
#endif如果您正在使用将此文件包含在其他几个文件中,则链接器会变得疯狂。包含意味着复制。因此,您已经多次定义自己的coolstuff::print。更好的方法(也是在许多文件中使用自写函数时唯一可能的方法)是将代码拆分成头部和实现,就像在高斯中所做的那样。
// coolstuff.namepace.h
#ifndef COOL_STUFF_NSPC
#define COOL_STUFF_NSPC
namespace coolstuff{
void print(void);
}
#endif当您包含coolstuff.namespace.h时,它将只声明函数。并且您可以多次声明同一个函数。
// coolstuff.namespace.cpp
#include <iostream>
#include "cs.h"
void coolstuff::print(void){
std::cout << "Hello world!" << std::endl;
}.cpp文件包含您的函数的实现。现在,您的链接器不会感到恼火,因为只有一个coolstuff::print实现,而不是n个(其中n是您使用的#include "cs.namespace.h"的数量)。
我的第一个问题是,c++名称空间的适当文件扩展名是什么?
没有标准的命名空间扩展。使用.h/.cpp作为头/实现和自定义前缀,例如'nmspc‘或'nsc’。由你决定。
https://stackoverflow.com/questions/9251271
复制相似问题