C++ 在对象列表中循环

C++ 在对象列表中循环,c++,json,casablanca,C++,Json,Casablanca,我试图循环浏览包含对象的列表。我使用天气API读取数据,将每个数据成员存储为一个对象,然后将每个对象存储在一个列表中。存储完整个列表后,我希望能够在列表中循环并显示对象。我以Json的形式读入数据,并使用casablanca包来实现这一点。我只想在main.cpp中的displayFullForcast函数中循环浏览我的列表。 以下是我的列表定义: list<Weather> weather; 列出天气; 这是我的标题: #pragma once #includ

我试图循环浏览包含对象的列表。我使用天气API读取数据,将每个数据成员存储为一个对象,然后将每个对象存储在一个列表中。存储完整个列表后,我希望能够在列表中循环并显示对象。我以Json的形式读入数据,并使用casablanca包来实现这一点。我只想在main.cpp中的displayFullForcast函数中循环浏览我的列表。 以下是我的列表定义:

list<Weather> weather;
列出天气;
这是我的标题:

    #pragma once

    #include<string>
    #include<iostream>
    #include <list>
    using std::list;
    using std::string;

    //const static int MAX_DAYS = 5;

    class Weather
    {
        public:
            Weather();
            ~Weather();
            Weather(double currentTemperature, double maxTemperature,
                double minTemperature, string weatherDescription,double humidity, string time);
            list<Weather> weather;
        private:
            string cityState;
            double currentTemperature;
            double highTemperature;
            double lowTemperature;
            string weatherDescription;
            double humidity;
            double highestTemperature;
            double lowestTemperature;
            string time;
    };
#pragma一次
#包括
#包括
#包括
使用std::list;
使用std::string;
//常量静态整数最大天数=5天;
班级天气
{
公众:
天气();
~Weather();
天气(双电流温度、双最大温度、,
双分钟温度、串天气描述、双湿度、串时间);
列出天气情况;
私人:
串晶;
双电流温度;
双高温;
双低温;
字符串描述;
双湿度;
双高温度;
双低温;
串时间;
};
以下是我的实现:

#include "Weather.h"
#include <list>
#include <string>
#include <iostream>

using std::cout;
using std::endl;
using std::cin;


Weather::Weather(double currentTemperature, double maxTemperature, double minTemperature,
    string weatherDescription, double humidity, string time) :
    cityState(cityState), currentTemperature(currentTemperature), highTemperature(highTemperature), lowTemperature(lowTemperature),
    weatherDescription(weatherDescription), humidity(humidity), time(time)
{
}
Weather::Weather()
{
    cityState = "";
    currentTemperature = 0.0;
    highTemperature = 0.0;
    lowTemperature = 0.0;
    weatherDescription = "";
    humidity = 0.0;
    highestTemperature = 0.0;
    lowestTemperature = 0.0;

}

Weather::~Weather()
{

}
#包括“Weather.h”
#包括
#包括
#包括
使用std::cout;
使用std::endl;
使用std::cin;
天气:天气(双电流温度、双最高温度、双最低温度、,
字符串天气描述、双湿度、字符串时间):
cityState(cityState)、currentTemperature(currentTemperature)、High Temperature(highTemperature)、Low Temperature(Low Temperature),
天气描述(天气描述)、湿度(湿度)、时间(时间)
{
}
天气
{
cityState=“”;
电流温度=0.0;
高温=0.0;
低温=0.0;
weatherDescription=“”;
湿度=0.0;
最高温度=0.0;
最低温度=0.0;
}
天气::~Weather()
{
}
这是我的主要.cpp

void displayFullForcast()
{
    list<Weather>weather;
    for (list<Weather>::iterator it = weather.begin(); it != weather.end(); ++it)
    {
        cout << *it << endl;
    }

}

void displayTodayForcast()
{
    list<Weather>weather;
}

void displayLowHigh()
{
    list<Weather>weather;
}

void displayHumidity()
{
    list<Weather>weather;
}


void displayMenu()
{
    int choice = 0;
    cout << "What option would you like to see:\n"
        << "(1) Forcast for 5 days\n"
        << "(2) Forcast for Today\n"
        << "(3) The Lowest and Highest Temperature\n"
        << "(4) Humidity for Today\n" << endl;
    cin >> choice;
    switch (choice)
            {
            case 1: displayFullForcast();
                break;
            case 2: displayTodayForcast();
                break;
            case 3: displayLowHigh();
                break;
            case 4: displayHumidity();
                break;
            }
}



void executeWeatherQuery()
{
    http_client client(U("http://api.openweathermap.org"));
    uri_builder builder(U("/data/2.5/forecast"));
    builder.append_query(U("q"), U("Searcy,AR"));
    builder.append_query(U("appid"), U("5ee41aef99a6e283abcdd5a04d89ae67"));
    builder.append_query(U("units"), U("imperial"));
    builder.append_query(U("mode"), U("json"));

    http_response response = client.request(methods::GET, builder.to_string()).get();
    web::json::value forecastJson = response.extract_json(true).get();
    web::json::value forecastListJson = forecastJson.at(U("list"));

    if (forecastListJson.is_array())
    {
        for (size_t i = 0; i < forecastListJson.size(); i++)
        {
            web::json::value forecastDayJson = forecastListJson[i];
            web::json::value mainJson = forecastDayJson.at(U("main"));
            web::json::value currentTemperatureJson = mainJson.at(U("temp"));
            double currentTemperature = 0;
            if (!currentTemperatureJson.is_null())
            {
                currentTemperature = currentTemperatureJson.as_double();
            }
            cout << "Current Temperature " << currentTemperature << endl;

            web::json::value weatherJson = forecastDayJson.at(U("weather"))[0];
            web::json::value mainWeatherJson = weatherJson.at(U("main"));
            string weatherDescription = "";
            if (!mainWeatherJson.is_null())
            {
                weatherDescription = conversions::to_utf8string(mainWeatherJson.as_string());
            }
            cout << "Weather Description " << conversions::to_utf8string(weatherDescription) << endl;

            web::json::value MainJson = forecastDayJson.at(U("main"));
            web::json::value minTemperatureJson = MainJson.at(U("temp"));
            double minTemperature = 0;
            if (!minTemperatureJson.is_null())
            {
                minTemperature = minTemperatureJson.as_double();
            }
            cout << "Min Temp: " << minTemperature << endl;

            web::json::value MainMaxJson = forecastDayJson.at(U("main"));
            web::json::value maxTemperatureJson = MainMaxJson.at(U("temp"));
            double maxTemperature = 0;
            if (!maxTemperatureJson.is_null())
            {
                maxTemperature = maxTemperatureJson.as_double();
            }
            cout << "Max " << maxTemperature << endl;

            web::json::value MainHumidityJson = forecastDayJson.at(U("main"));
            web::json::value humidityJson = MainHumidityJson.at(U("humidity"));

            double humidity = 0;
            if (!MainHumidityJson.is_null())
            {
                humidity = humidityJson.as_double();
            }
            cout << "Humidity: " << humidity << endl;

            web::json::value MainTimeJson = forecastDayJson.at(U("dt_txt"));
            string time = "";
            if (!MainTimeJson.is_null())
            {
                time = conversions::to_utf8string(MainTimeJson.as_string());

                //time = localtime(time);
            }
            cout << "Time" << time << endl;

            Weather WeatherForcast(currentTemperature, maxTemperature, minTemperature,
                weatherDescription, humidity, time);
            list<Weather>weather;
            weather.push_back(WeatherForcast);
        }
    }
}

void main()
{
    /*string location;
    cout << "Please enter a city and a State (Example: Searcy,AR)" << endl;
    cin >> location;*/
    executeWeatherQuery();


displayMenu();
}
void displayFullForcast()
{
利斯特韦瑟;
for(list::iterator it=weather.begin();it!=weather.end();++it)
{

cout您的问题似乎是,在每个函数中,您都有一个单独的本地天气列表

因此,您将数据收集到一个在函数末尾被销毁的列表中,然后显示刚刚创建的另一个列表的内容(该列表为空)


改为使用一个全局listweather。

我没有安装特定的weather API包,但从您的代码来看,您似乎只是遇到了范围界定问题

executeWeatherQuery
中,声明一个
列表weather;
,然后执行
weather。向后推(WeatherForcast)
;该
weather
对象仅是
executeWeatherQuery
函数的本地对象,因此一旦该函数结束,该
weather
对象将超出范围,并且其中的数据不再有效。此外,要
显示该列表的其他函数都将创建自己的本地
列表weather;

取而代之的是,试着用一个全局的
列表天气操作。下面是一个静态的局部(全局)天气对象的主代码:

static list<Weather> weather;

void displayFullForcast()
{
    for (list<Weather>::iterator it = weather.begin(); it != weather.end(); ++it)
    {
        cout << *it << endl;
    }
}

void displayTodayForcast()
{
}

void displayLowHigh()
{
}

void displayHumidity()
{
}


void displayMenu()
{
    int choice = 0;
    cout << "What option would you like to see:\n"
        << "(1) Forcast for 5 days\n"
        << "(2) Forcast for Today\n"
        << "(3) The Lowest and Highest Temperature\n"
        << "(4) Humidity for Today\n" << endl;
    cin >> choice;
    switch (choice)
            {
            case 1: displayFullForcast();
                break;
            case 2: displayTodayForcast();
                break;
            case 3: displayLowHigh();
                break;
            case 4: displayHumidity();
                break;
            }
}



void executeWeatherQuery()
{
    http_client client(U("http://api.openweathermap.org"));
    uri_builder builder(U("/data/2.5/forecast"));
    builder.append_query(U("q"), U("Searcy,AR"));
    builder.append_query(U("appid"), U("5ee41aef99a6e283abcdd5a04d89ae67"));
    builder.append_query(U("units"), U("imperial"));
    builder.append_query(U("mode"), U("json"));

    http_response response = client.request(methods::GET, builder.to_string()).get();
    web::json::value forecastJson = response.extract_json(true).get();
    web::json::value forecastListJson = forecastJson.at(U("list"));

    if (forecastListJson.is_array())
    {
        for (size_t i = 0; i < forecastListJson.size(); i++)
        {
            web::json::value forecastDayJson = forecastListJson[i];
            web::json::value mainJson = forecastDayJson.at(U("main"));
            web::json::value currentTemperatureJson = mainJson.at(U("temp"));
            double currentTemperature = 0;
            if (!currentTemperatureJson.is_null())
            {
                currentTemperature = currentTemperatureJson.as_double();
            }
            cout << "Current Temperature " << currentTemperature << endl;

            web::json::value weatherJson = forecastDayJson.at(U("weather"))[0];
            web::json::value mainWeatherJson = weatherJson.at(U("main"));
            string weatherDescription = "";
            if (!mainWeatherJson.is_null())
            {
                weatherDescription = conversions::to_utf8string(mainWeatherJson.as_string());
            }
            cout << "Weather Description " << conversions::to_utf8string(weatherDescription) << endl;

            web::json::value MainJson = forecastDayJson.at(U("main"));
            web::json::value minTemperatureJson = MainJson.at(U("temp"));
            double minTemperature = 0;
            if (!minTemperatureJson.is_null())
            {
                minTemperature = minTemperatureJson.as_double();
            }
            cout << "Min Temp: " << minTemperature << endl;

            web::json::value MainMaxJson = forecastDayJson.at(U("main"));
            web::json::value maxTemperatureJson = MainMaxJson.at(U("temp"));
            double maxTemperature = 0;
            if (!maxTemperatureJson.is_null())
            {
                maxTemperature = maxTemperatureJson.as_double();
            }
            cout << "Max " << maxTemperature << endl;

            web::json::value MainHumidityJson = forecastDayJson.at(U("main"));
            web::json::value humidityJson = MainHumidityJson.at(U("humidity"));

            double humidity = 0;
            if (!MainHumidityJson.is_null())
            {
                humidity = humidityJson.as_double();
            }
            cout << "Humidity: " << humidity << endl;

            web::json::value MainTimeJson = forecastDayJson.at(U("dt_txt"));
            string time = "";
            if (!MainTimeJson.is_null())
            {
                time = conversions::to_utf8string(MainTimeJson.as_string());

                //time = localtime(time);
            }
            cout << "Time" << time << endl;

            Weather WeatherForcast(currentTemperature, maxTemperature, minTemperature,
                weatherDescription, humidity, time);
            weather.push_back(WeatherForcast);
        }
    }
}

void main()
{
    /*string location;
    cout << "Please enter a city and a State (Example: Searcy,AR)" << endl;
    cin >> location;*/
    executeWeatherQuery();
    displayMenu();
}
静态列表天气;
void displayFullForcast()
{
for(list::iterator it=weather.begin();it!=weather.end();++it)
{

cout除了其他人提到的作用域问题外,您还需要编写一个函数来打印对象:

std::ostream& operator <<(std::ostream& str, const Weather & w)
{
    str << "Temp will be " << w.temp << std::endl;
}

std::ostream&operator我还编辑了我的代码以修复范围错误。