2014-09-26 33 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/