2015-03-02 33 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

相关问题