2015-03-02 29 views
1

首先,這是一個普遍的問題如何從另一個.cpp源文件調用main.cpp中定義的方法?

第二:我想到了它,因爲現在它在我的一個項目中使事情變得複雜。別擔心,我有一個解決方法,但我仍然想知道是否有其他解決方法。

進入問題:

我有我的main.cpp。我定義了一些方法和功能。我還有一些其他功能和其他功能的文件,但現在我需要一個可以在main.cpp中定義的臨時變量的函數。 如何擴展這樣一個變量的範圍,以便我可以在其他文件中使用它?

從類,我知道字段可以是私人或公共。但是這個變量呢?它是私人的嗎?上市?別的東西?我可以爲這個變量創建一個getter/setter嗎?我甚至不能包括其他的main.cpp中,因爲這將是遞歸的,我不得不主要定義無限次,然後....)

的主要問題是:

如何訪問在我的main.cpp中另一個文件中定義的變量?

一些示例代碼:

在main.cpp中

int var = 0; 

int getVar() { 
    return var; 
} 


void doVar() { 
    // sth happens with var 
} 

int main() { 
    MyObject myObj; 

    doVar(); 
} 
在MyObject.cpp

class MyObject { 
    void DoSth(){ 
     // NEEDS var from main.cpp, to do sth with it! 
     // getVar() doesn't work! 
     // doVar() doesn't work either! 
    } 
} 

原諒我,如果這是一個以前問過的或真正愚蠢的問題,但我真的很想知道這個

我的解決方法是我做了doVar和var與MyObject的成員(即現在它的全部在同一個文件MyObject.cpp中),但這是唯一的方法嗎?

+0

爲什麼downvote?你介意至少解釋一下嗎? – blueBurningCoder 2015-03-02 19:00:20

+0

我想你可以在MyObject.cpp中編寫'extern int var;'並且如果你真的想要一個全局的,那麼也可以這樣做,但也許有更好的解決方案。我不清楚你想要達到什麼目的。 (downvote不是我的,我不參與!) – tux3 2015-03-02 19:00:56

+0

它會做什麼?我只是搜索了一些類似「靜態」的東西,是嗎?所以有什麼區別? – blueBurningCoder 2015-03-02 19:07:29

回答

3

「難道是private/public /別的嗎?」

這種被稱爲全局變量,這是公開可見。任何人都可以訪問它,只需提供extern int var;聲明。

「我可以爲這個變量創建一個getter/setter嗎?」

是的,你可以做(​​見下文解釋)

「我甚至不能包括其他的main.cpp中,因爲這將是遞歸的,我不得不主要定義無限次,然後....)」

當然,你不能這樣做(除了你再也不想在任何地方包括.cpp文件)。
你需要一些頭聲明這個接口爲被外部實現,像

VarInterface.hpp

#ifndef VARINTERFACE_HPP 
#define VARINTERFACE_HPP 

extern int var; // Optional, just encapsulating it with the functions is the 
       // better choice 
int getVar(); 
void doVar(); 

#endif // VARINTERFACE_HPP 

,包括其與MyObject.cpp您的實現。


至於你comment

「?那會是什麼我只是用Google搜索,並用類似static發生什麼事了,是不是有啥區別?」

有免費的功能沒有privatepublic訪問範圍的政策(如與C static關鍵字)。

上述示例中顯示的任何函數或全局變量聲明實際上都是可訪問的,除非將其置於未命名的名稱空間中。後者真正限制到翻譯單元連接訪問它們被放置在:

Another.cpp

namespace { 
    // These functions and variables are exclusively accessible within 
    // Another.cpp 
    int var = 0; 
    int getVar(); 
    void doVar(); 
} 

但走在上面就像一個方面說明,既然你想相反,據我瞭解,從你的問題。


「你能在其中創建‘私人’領域,並以某種方式從其他的.cpp訪問他們在這個項目?」

如果你想隱藏其他的翻譯單元(推薦)int var;聲明/定義,你仍然可以做到像

VarInterface.hpp

#ifndef VARINTERFACE_HPP 
#define VARINTERFACE_HPP 

int getVar(); 
void doVar(); 

#endif // VARINTERFACE_HPP 

MyObject.cpp

#include "VarInterface.hpp" 

namespace { 
    int var = 0; 
} 

int getVar() { 
    return var; 
} 

void doVar() { 
    // sth happens with var 
} 

main.cpp

#include "VarInterface.hpp" 

int main() { 
    MyObject myObj; 

    doVar(); 
} 
+0

好吧,但我需要定義函數和我的方法類,它是否可以從我的'int main'中使用? – blueBurningCoder 2015-03-02 19:17:00

+0

@blueBurningCoder _「是否也可以從我的'int main()'中使用?」_當然,如果你需要在'main.cpp'和'MyObject.cpp'中包含這個頭文件然後。 – 2015-03-02 19:19:24

+0

我的意思是 - 它只是標題,而不是定義,所以它在每個地方都有定義呢?這就是我缺少的點 – blueBurningCoder 2015-03-02 19:21:35

0

聲明你需要任何外部變量或函數:

extern int var; 
int getVar(); 
void doVar(); 

或者使用它們的源文件,或報頭中,可以通過任何文件被包括那想要使用它們。

+0

我對「外部」關鍵字並不熟悉 - 你能介紹一下你試圖用它實現的目標嗎?我會谷歌它,也許我可以按照它吧 – blueBurningCoder 2015-03-02 19:07:02

+0

好吧,所以基本上我需要在那裏定義他們也不是嗎? – blueBurningCoder 2015-03-02 19:18:31

+0

@blueburningcoder不,它們已經定義過一次,不能再次定義。你只需要一個聲明來從另一個文件訪問它們。 – 2015-03-02 20:04:40

相關問題