C++ - 在一个 function/file 中初始化变量然后在 main()/另一个文件中使用它的最佳方法是什么?
C++ - what's the best way to initialize a variable in one function/file and then use it in main()/another file?
在 C++ 中,假设我需要给一个变量赋值,我想在 main() 之外进行,这样代码更清晰,但我想在 main() 内部使用该变量进行一些操作或其他功能。例如我有:
int main()
{
int a = 10;
int b = 20;
SomeFunction(a,b);
}
我想要这样的东西:
void Init()
{
int a = 10;
int b = 20;
}
int main()
{
SomeFunction(a,b);
}
但显然编译器会说 a 和 b 在 main() 的范围内未声明。我总是可以将它们声明为全局变量,但可能有更好的方法来解决这个问题,我读到全局变量在 long 运行 中并不是那么好。我不想使用 类。那么你们有什么建议呢?
使用结构:
struct data
{
int x;
int y;
};
data Init()
{
data ret;
ret.x = 2;
ret.y = 5;
return ret;
}
int main()
{
data v = Init();
SomeFunction(v.x, v.y); //or change the function and pass there the structure
return 0;
}
如果您甚至不想使用结构,那么您可以通过引用将值传递给 Init 函数。但是我觉得第一个版本更好。
void Init(int &a, int &b)
{
a = 5;
b = 6;
}
int main()
{
int a, b;
Init(a, b);
return 0;
}
您可以使用 extern
关键字。它允许变量定义一次,然后到处使用。你可以这样使用它:
// main.cpp
extern int a;
extern int b;
并在您的其他文件中执行
// Other.cpp
int a = 10;
int b = 20;
您可以用 extern
多次声明它们,但您只能定义一次。
您可以阅读更多关于 extern
here。
根据具体情况,您可能希望将这些变量的值存储在一个文件中,并在需要时从磁盘中读取它们。例如,您可以有 data_values.txt,其中有 space 个分隔的整数:324 26 435 ....
然后在另一个源文件中定义一个文件读取函数,比如说data_reader.cpp:
#include<fstream>
#include<string>
#include<vector>
std::vector<int> get_data(const std::string& file_name){
// Initialize a file stream
std::ifstream data_stream(file_name);
// Initialize return
std::vector<int> values;
// Read space separated integers into temp and add them to the back of
// the vector.
for (int temp; data_stream >> temp; values.push_back(temp))
{} // No loop body is necessary.
return values;
}
在您想使用该功能的任何文件中,输入
#include <string>
#include <vector>
// Function declaration
std::vector<int> get_data(const std::string& file_name);
// File where the data is stored
const std::string my_data_file {"data_values.txt"};
void my_function() {
... // do stuff here
std::vector<int> data_values = get_data(my_data_file);
... // process data
}
如果您也避免使用 C++ 标准库中的 类,那么您可能希望对 return 值使用 int 数组,对文件使用 char* 或 char 数组name 和 scanf 或其他一些用于读取文件的 C 函数。
在 C++ 中,假设我需要给一个变量赋值,我想在 main() 之外进行,这样代码更清晰,但我想在 main() 内部使用该变量进行一些操作或其他功能。例如我有:
int main()
{
int a = 10;
int b = 20;
SomeFunction(a,b);
}
我想要这样的东西:
void Init()
{
int a = 10;
int b = 20;
}
int main()
{
SomeFunction(a,b);
}
但显然编译器会说 a 和 b 在 main() 的范围内未声明。我总是可以将它们声明为全局变量,但可能有更好的方法来解决这个问题,我读到全局变量在 long 运行 中并不是那么好。我不想使用 类。那么你们有什么建议呢?
使用结构:
struct data
{
int x;
int y;
};
data Init()
{
data ret;
ret.x = 2;
ret.y = 5;
return ret;
}
int main()
{
data v = Init();
SomeFunction(v.x, v.y); //or change the function and pass there the structure
return 0;
}
如果您甚至不想使用结构,那么您可以通过引用将值传递给 Init 函数。但是我觉得第一个版本更好。
void Init(int &a, int &b)
{
a = 5;
b = 6;
}
int main()
{
int a, b;
Init(a, b);
return 0;
}
您可以使用 extern
关键字。它允许变量定义一次,然后到处使用。你可以这样使用它:
// main.cpp
extern int a;
extern int b;
并在您的其他文件中执行
// Other.cpp
int a = 10;
int b = 20;
您可以用 extern
多次声明它们,但您只能定义一次。
您可以阅读更多关于 extern
here。
根据具体情况,您可能希望将这些变量的值存储在一个文件中,并在需要时从磁盘中读取它们。例如,您可以有 data_values.txt,其中有 space 个分隔的整数:324 26 435 ....
然后在另一个源文件中定义一个文件读取函数,比如说data_reader.cpp:
#include<fstream>
#include<string>
#include<vector>
std::vector<int> get_data(const std::string& file_name){
// Initialize a file stream
std::ifstream data_stream(file_name);
// Initialize return
std::vector<int> values;
// Read space separated integers into temp and add them to the back of
// the vector.
for (int temp; data_stream >> temp; values.push_back(temp))
{} // No loop body is necessary.
return values;
}
在您想使用该功能的任何文件中,输入
#include <string>
#include <vector>
// Function declaration
std::vector<int> get_data(const std::string& file_name);
// File where the data is stored
const std::string my_data_file {"data_values.txt"};
void my_function() {
... // do stuff here
std::vector<int> data_values = get_data(my_data_file);
... // process data
}
如果您也避免使用 C++ 标准库中的 类,那么您可能希望对 return 值使用 int 数组,对文件使用 char* 或 char 数组name 和 scanf 或其他一些用于读取文件的 C 函数。