2014-09-26 68 views
0

我很困惑如何在多个文件中定义和声明我的变量和函数,而不使用全局变量。 比方说,我想要在'main.cpp'之外声明和定义变量和函数,并在'main.cpp'中使用单独的头文件和源文件。在单独的文件中声明和定义变量和函数

编辑:道歉为我不清楚的例子,但只会有一个气球。我不想让气球成为一个物体。这只是举行一些变量和功能。

//balloon.h 
bool inflated = true; 
void pop(); 

-

//balloon.cpp 
#include "balloon.h" 
void pop() 
{ 
    inflated = false; 
} 

-

//main.cpp 
#include "balloon.h" 
int main() 
{ 
    pop(); 
    return 0; 
} 

如果我这样做,它给我的错误对于具有 '膨胀' 多重定义,而且它是在“气球第一个声明。 CPP”。

如果我使用'extern',它可以工作,但是会给我一些关于在'balloon.h'中初始化和声明'膨胀'的警告。

如果我决定在balloon.h中不定义膨胀,它会给我提供有关'膨胀'的未定义引用的错误。

这是什么标准的方法呢?我错过了多个文件中的变量/函数声明/定义的一些关键信息吗?

+0

你所描述的是**是一个全局变量。 – 2014-09-26 20:45:57

+0

但我不想使用全局变量。 – 2014-09-26 20:48:01

+0

然后上课。 – 2014-09-26 20:48:49

回答

1

直线距离应该是

//balloon.h 
extern bool inflated; 
void pop(); 

//balloon.cpp 
#include "balloon.h" 

bool inflated = true; 

void pop() { 
    inflated = false; 
} 
0

没有“标准”的方式,而是像操作的单个逻辑对象显然你正在瞄准:某些功能操作一些共同的共享变量。

这就是最初的模块概念。 C和Modula-2。

在C中,在实现文件中声明变量为static,以便不会将其名称暴露给链接器。这被称为内部联动。在C++中使用的static已被弃用,而不是一个应该优先使用匿名命名空间:

balloon.h

#pragma once 
auto is_inflated() -> bool; 
void inflate(); 

balloon.cpp

#include "ballon.h" 

namespace { 
    bool inflated = true; 
} // namespace anon 

auto is_inflated() -> bool { return ::inflated; } 
void inflate() { ::inflated = true; } 

但不是这个老式的模块作为一个逻辑变量,考虑定义一个类。

这就是对于


声明:代码不受编译器的影响。

0

如果你不想使用全局变量,那么创建类来做OOP风格。

class A 
{ 
public: 
bool inflated = true; 
void pop(); 
} 

就像你在问题你可以分离规范和实现,它应该是这样的:

void A::pop() 
{ 
    bool inflated = false; 
} 

然后包括在主要的.h文件,并创建一个类的对象:A* a = new A(); 欲了解更多参考http://www.cplusplus.com/doc/tutorial/classes/