如何从另一个.cpp源文件调用main.cpp中定义的方法
How to call a method defined in main.cpp from another .cpp source file?
首先,这是的一个一般问题
第二:我想到它是因为现在它使我的一个项目中的事情变得复杂。别担心,我有一个变通办法,但我仍然想知道是否有其他方法可以解决它
进入问题:
我有我的main.cpp。我在其中定义了一些方法和函数。我还有一些其他文件和其他函数,但现在我需要一个函数,它可以处理main.cpp中定义的临时变量。如何扩展这样一个变量的范围,以便在其他文件中也可以使用它?
从课堂上,我知道字段可以是私有的,也可以是公共的。但是这个变量呢?它是私人的吗?平民的还有别的吗?我可以为这个变量创建一个getter/setter吗?我甚至不能将main.cpp包含在另一个中,因为它是递归的,而且我已经定义了无数次main…)
主要问题是:
如何在另一个文件中访问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中),但这是唯一的方法吗?
"是
private
/public
/其他什么吗?"
这被称为全局变量,它是公开可见的。只要提供extern int var;
语句,任何人都可以访问它。
"我可以为这个变量创建一个getter/setter吗?"
是的,你可以做(见后面的解释)
"我甚至不能将main.cpp包含在另一个中,因为它是递归的,并且我已经定义了无数次main…)"
当然,您不能这样做(此外,您永远不想在任何地方包含.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
中的实现中。
至于你的评论:
"它会做什么?我只是在谷歌上搜索了一下,找到了类似于
static
的东西,对吗?那有什么区别?"
没有针对免费函数的private
或public
访问范围策略(如使用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();
}
声明您需要的任何外部变量或函数:
extern int var;
int getVar();
void doVar();
在使用它们的源文件中,或者在任何想要使用它们的文件都可以包含的头中。
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 可以在 cpp 文件中C++定义为特殊符号的变量β
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- CPP 程序中未定义的行为
- 使用命名空间在另一个".cpp"文件中定义
- 如何从 cpp 中的函数返回自定义类对象?
- 在两个.cpp文件之间定义全局类/结构指针
- .cpp文件中未定义的引用错误
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- CPP:定义模板时,通用数据类型 T 是类吗?
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 在.cpp文件中定义方法而不是在 C++ 的 .h 文件中定义方法时,如何提高代码的性能?
- 将CPP定义移植到python