因此,为了避免让自己头痛(并造成头痛),我试图将一个字符串数组成员放在同名的结构变量前面,但是它不起作用并且给我一个错误:std :: string {aka类std :: basic_string}'没有名为'maxPerDay'“的成员
我正在尝试使其到达读取字符串数组值的位置并使之进入,以便它输入该结构值的值(如果可以的话)。
struct monthlyData{
int planesLanded;
int planesDeparted;
int maxPerDay;
int leastPerDay;
};
这就是我的结构所组成的。
我在下面声明了monthlyData变量:
monthlyData Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec;
此外,这是我的字符串数组的样子:
string monthNames[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
这是我正在尝试实现的循环,希望可以节省一些时间,而不必手动进行编码:
for (int i = 0; i < 12; i++)
{
cout << "Enter planes landed for " << monthNames[i] << endl;
cin >> monthNames[i].planesLanded;
cout << "Enter planes departed for " << monthNames[i] << endl;
cin >> monthNames[i].planesDeparted;
cout << "Enter max departures per day in " << monthNames[i] << endl;
cin >> monthNames[i].maxPerDay;
cout << "Enter least per day in " << monthNames[i] << endl;
cin >> monthNames[i].leastPerDay;
}
我只想让程序允许用户将数字输入相应的月份结构。我只是不想在我的代码上多余。
答案 0 :(得分:3)
您可以使用这些结构的地址构建一个与月份名称“平行”的数组:
monthlyData *monthAddr[] = { &Jan, &Feb, &Mar, &Apr, &May, &Jun,
&Jul, &Aug, &Sep, &Oct, &Nov, &Dec };
然后您可以输入
cout << "Enter planes landed for " << monthNames[i] << endl;
cin >> monthAddr[i]->planesLanded;
但是,更好的选择是避免重复自己,而仅使用std::map
,例如从月份名称到月份结构,而不使用显式变量
std::map<std::string, monthlyData> data;
然后您可以使用data["Jan"]
代替Jan
。
使用地图,您还可以使用data[monthNames[i]]
将其编入索引。
比映射简单的只有12个结构的数组,但是您的代码将需要使用数字索引(例如,data[0]
而不是Jan
):
monthlyData data[12];
但是如果您需要引用单个名称,则可以创建引用以使代码更具可读性
auto& Jan = data[0];
auto& Feb = data[1];
auto& Mar = data[2];
auto& Apr = data[3];
以此类推...
答案 1 :(得分:0)
您似乎正在尝试对代码进行某种形式的反思。 C ++对代码反射的支持非常有限,即使在具有更强大支持的语言中,这也不是一个非常意识形态的解决方案。
您应该将月份名称与数据相关联。
struct MonthlyData{//I've renamed the struct to CapitalCase
MonthlyData(std::string month) :
month(std::move(month)), planesLanded(0), planesDeparted(0), maxPerDay(0), leastPerDay(0)
{}
std::string month;
int planesLanded;
int planesDeparted;
int maxPerDay;
int leastPerDay;
};
int main() {
std::vector<MonthlyData> vec {
{"Jan"},
{"Feb"},
{"Mar"},
{"Apr"},
{"May"},
{"Jun"},
{"Jul"},
{"Aug"},
{"Sep"},
{"Oct"},
{"Nov"},
{"Dec"},
};
for (auto & data : vec) {
cout << "Enter planes landed for " << data.month << endl;
cin >> data.planesLanded;
cout << "Enter planes departed for " << data.month << endl;
cin >> data.planesDeparted;
cout << "Enter max departures per day in " << data.month << endl;
cin >> data.maxPerDay;
cout << "Enter least per day in " << data.month << endl;
cin >> data.leastPerDay;
}
}