有没有办法将字符串数组成员放在“ .structurevariable”前面?

时间:2019-11-05 21:47:13

标签: c++

因此,为了避免让自己头痛(并造成头痛),我试图将一个字符串数组成员放在同名的结构变量前面,但是它不起作用并且给我一个错误: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;
    }

我只想让程序允许用户将数字输入相应的月份结构。我只是不想在我的代码上多余。

2 个答案:

答案 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;
    }
}