gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:09 24 4
gpt4 key购买 nike

首先,这是一个普遍的问题

第二:我想到它是因为现在它使我的一个项目中的事情变得复杂。别担心,我有解决方法,但我仍然想知道是否有其他解决方法。

进入问题:

我有我的 main.cpp。我在里面定义了一些方法和函数。我还有一些包含其他函数和内容的其他文件,但现在我需要一个函数来处理在 main.cpp 中定义的临时变量。我怎样才能扩展这样一个变量的范围,以便我也可以在其他文件中使用它?

从类中,我知道字段可以是私有(private)的或公共(public)的。但是这个变量呢?是私有(private)的吗?民众?还有什么?我可以为这个变量创建一个getter/setter吗?我什至不能将 main.cpp 包含在另一个中,因为它将是递归的,然后我将定义无限次 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 中),但这是唯一的方法吗?

最佳答案

"Is it private / public / something else?"

这称为全局变量,它是公开可见的。任何人只要提供 extern int var; 语句就可以访问它。

"can I create a getter/setter for this variable?"

是的,你可以做到(见后面的解释)

"I can't even include the main.cpp in another since it would be recursive and I'd have main defined infinite times then ....)"

当然你不能这样做(此外你永远不想在任何地方包含 .cpp 文件)。
你需要一些 header 来声明这个接口(interface)是在外部实现的,比如

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 :

"what would it do? I just googled and came up with something similar to static, is that right? so what's the difference?"

没有针对自由函数的privatepublic 访问范围策略(与 C static 关键字一样)。

如上例所示的任何函数或全局变量声明实际上都是可访问的,除非它被放置在未命名的命名空间中。后者确实限制了链接器访问它们所在的翻译单元:

另一个.cpp

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

但请将以上内容作为旁注,因为据我从您的问题中了解到,您想要的恰恰相反。


"Can you create 'private' fields in it and somehow access them from another .cpp in this project?"

如果你想对其他翻译单元隐藏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();
}

关于c++ - 如何从另一个 .cpp 源文件调用 main.cpp 中定义的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28817383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com