如何从另一个.cpp源文件中调用main.cpp中定义的方法?

时间:2015-03-02 18:56:32

标签: c++ main

首先,这是一般性问题

第二:我想到了它,因为现在它在我的一个项目中复杂化了。不要担心我有一个解决方法,但我仍然想知道是否有另一种解决方法。

回答问题:

我有我的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中),但这是唯一的方法吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

声明您需要的任何外部变量或函数:

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

在使用它们的源文件中,或者任何想要使用它们的文件都可以包含的标题。