无法弄清楚如何将结构数组传递给函数
Can't figure out how to pass struct array to function
我有一个头文件、主 cpp 文件和函数文件,我正在尝试将 stuct 数组从主函数传递到函数文件,但无法弄清楚语法。我已经剥离了完成的代码以显示我在做什么而没有显示数百行代码。
我已经尝试了我所知道的所有变体来传递结构数组,但它无法编译;我已经阅读了我能找到的所有内容,但找不到解决方案;我知道这只是我没有搞清楚的语法问题。
header.h 文件
#ifndef myHeader_h
#define myHeader_h
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct MyStruct
{
float var1;
float var2;
float var3;
};
struct MyStruct2
{
string var4;
string var5;
bool var6;
MyStruct struct1;
};
int enterFunction(int maxNumber, int & currentNumber, structList);
#endif
主程序
#include "myHeader.h"
int main()
{
int currentNumber = 0, maxNumber = 0;
MyStruct *structList;
structList = new MyStuct[maxNumber];
enterFunction(currentNumber, maxNumber, structList);
return 0;
}
函数文件
#include "myHeader.h"
int enterFunction(int maxNumber, int & currentNumber, structList)
{
// DO MORE STUFF HERE
}
您应该使用 RAII 来管理资源,而不是容易出错的手动内存管理。 C++ 对此有 std::vector
,它让生活变得更轻松。我猜函数 enterFunction
应该从文件或键盘读取一些结构,所以任务是创建一个输入值列表。您可以传递对向量的引用:
int enterFunction(int maxNumber, int & currentNumber, std::vector<MyStruct2>& structlist);
但是,我会将签名更改为 return 具有输入值的向量。这使得函数更容易理解和推理:
std::vector<MyStruct2> enterFunction(int maxNumber) {
std::vector<MyStruct2> inputs;
// let's assume that >> is overloaded for MyStruct2
while (inputs.size() < maxNumber) {
MyStruct2 x;
cin >> x;
inputs.push_back( std::move(x) );
}
return inputs;
}
请注意,这不会将矢量复制为 return 值,因为它使用命名 return 值优化。
在您的 header.h 文件中,而不是
int enterFunction(int maxNumber, int & currentNumber, structList);
你需要
int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList);
在你的函数文件中,同样你需要
int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList)
就是这样!
顺便说一下,像那样将 using namespace std
(或任何 using
指令)放入 header 文件中是危险的。如果他们必须包含您的 header,它可能会破坏其他人的代码。最好将其放入您的 C
文件中。 (即使没有人会包含您的 header,养成这种习惯也是一个坏习惯。)参见 this Whosebug question。
我有一个头文件、主 cpp 文件和函数文件,我正在尝试将 stuct 数组从主函数传递到函数文件,但无法弄清楚语法。我已经剥离了完成的代码以显示我在做什么而没有显示数百行代码。
我已经尝试了我所知道的所有变体来传递结构数组,但它无法编译;我已经阅读了我能找到的所有内容,但找不到解决方案;我知道这只是我没有搞清楚的语法问题。
header.h 文件
#ifndef myHeader_h
#define myHeader_h
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct MyStruct
{
float var1;
float var2;
float var3;
};
struct MyStruct2
{
string var4;
string var5;
bool var6;
MyStruct struct1;
};
int enterFunction(int maxNumber, int & currentNumber, structList);
#endif
主程序
#include "myHeader.h"
int main()
{
int currentNumber = 0, maxNumber = 0;
MyStruct *structList;
structList = new MyStuct[maxNumber];
enterFunction(currentNumber, maxNumber, structList);
return 0;
}
函数文件
#include "myHeader.h"
int enterFunction(int maxNumber, int & currentNumber, structList)
{
// DO MORE STUFF HERE
}
您应该使用 RAII 来管理资源,而不是容易出错的手动内存管理。 C++ 对此有 std::vector
,它让生活变得更轻松。我猜函数 enterFunction
应该从文件或键盘读取一些结构,所以任务是创建一个输入值列表。您可以传递对向量的引用:
int enterFunction(int maxNumber, int & currentNumber, std::vector<MyStruct2>& structlist);
但是,我会将签名更改为 return 具有输入值的向量。这使得函数更容易理解和推理:
std::vector<MyStruct2> enterFunction(int maxNumber) {
std::vector<MyStruct2> inputs;
// let's assume that >> is overloaded for MyStruct2
while (inputs.size() < maxNumber) {
MyStruct2 x;
cin >> x;
inputs.push_back( std::move(x) );
}
return inputs;
}
请注意,这不会将矢量复制为 return 值,因为它使用命名 return 值优化。
在您的 header.h 文件中,而不是
int enterFunction(int maxNumber, int & currentNumber, structList);
你需要
int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList);
在你的函数文件中,同样你需要
int enterFunction(int maxNumber, int & currentNumber, MyStruct * structList)
就是这样!
顺便说一下,像那样将 using namespace std
(或任何 using
指令)放入 header 文件中是危险的。如果他们必须包含您的 header,它可能会破坏其他人的代码。最好将其放入您的 C
文件中。 (即使没有人会包含您的 header,养成这种习惯也是一个坏习惯。)参见 this Whosebug question。