0

hi reached a point where im not sure how to proceed. the main objective of my program:

1) read 5 values from a file(.csv)

  • date (class with 3 variables - day,month, year)

  • time (class with 2 variables - minute, hour)

  • float wSpeed (under class weather)

  • float temperature (under class weather)

  • float solarRadiation (under class weather)

2) put into an object

3) put it into a vector

main

   int main()
{
 string filename;
 ifstream input;

Vector<weather> windlog; //have a vector called windlog

cout <<"enter file name:" <<endl;
cin >> filename;

input.open(filename.c_str());
input.ignore(500,'\n');

string sDay, sMonth, sYear, sHH, sMM, wind, solar, temperature;
date d1;
time t1;
weather w1;

getline(input, sDay,'/'); //stop getting input at '/'
getline(input, sMonth,'/');
getline(input, sYear,' ');
getline(input, sHH,':');
getline(input, sMM,',');

int day1 = atoi(sDay.c_str()); //convert string to int (atoi)
int month1 = atoi(sMonth.c_str());
int year1 = atoi(sYear.c_str());
int hour1 = atoi(sHH.c_str());
int min1 = atoi(sMM.c_str());

d1.setDate(day1,month1,year1); //set date using converted string
t1.setTime(min1, hour1); //set time using converted string

         // skip the first 9 columns of .csv file
    for(int i=0; i<9; i++) 
     {
        input.ignore(50, ','); //ignore ','
     }

        //location now at wSpeed date of .csv file
    getline(input, wind,',');
    float wS1 = atof(wind.c_str()); // convert string to float

       //next location is the location solarRadiation
    getline(input, solar,',');
    float sR1= atof(solar.c_str()); // convert string to float

      //move 5 columns
     for(int i=0; i< 5; i++)
     {
      input.ignore(50, ',');
     }

      //at location of temperature
     getline(input, temperature,'\n');
    float temperature1 = atof(temperature.c_str()); // convert string to 
                                                       float

    //when i print it out, it gives me the correct data
    /*
cout << d1; //date class that contains dd,mm,yy
cout << t1;//time class that contains hh, mm
cout << wS1 ;
cout << sR1;
cout << temperature1 << endl;
    */

 //trying to put these data into an object file: weather

 //i tried doing something like this
weather obj1(wS1, sR1, temperature1, d1, t1);
cout << objt1;//gives me weird values but when i cout each variable, it 
 works out fine

not going to write the whole date/time.h/cpp cause i think it'll take up too much space

date.h

  public:
  setday, setmonth, setyear, setdate(day,month,year);
  getday,getmonth,getyear;
  private: day,month,year;

time.h

  public:
  setminute, sethour, settime(minute,hour);
  getminute,get hour;
  private: minute, hour;

weather class(where im having the problems)

.H

  #ifndef H_WEATHER  
  #define  H_WEATHER
  #include <iostream>
  #include <string>
  #include "time.h"
  #include "date.h"
  using namespace std;

  class weather: public date, time
     {
     friend ostream& operator << (ostream&, const weather&);
     friend istream& operator >> (istream&, weather&);
        public:
          weather();
          weather(float wSpeed, float solarRadiation, float temperature, 
          date d1, time t1);

          ~weather();

           void setWspeed(float wSpeed);
           void setSolarRadiation(float solarRadiation);
           void setTemperature(float temperature);

           float getWspeed() const ;
           float getSolarRadiation() const;
           float getTemperature() const;
           void setWeather(float wS, float sR, float t,date d1, time t1);
           date getDate();
           time getTime();
           date d1;//mm, hh
           time t1;//dd,mm,yy
        private:
           float wSpeed;
           float solarRadiation;
           float temperature;
           };
      #endif

.CPP

   #include <iostream>
   #include "weather.h"
   #include "date.h"
   #include "time.h"

    weather::weather()
    {
     wSpeed=0;
     solarRadiation=0;
     temperature = 0;
     }

     weather::weather(float wS, float sR, float t, date d1, time 
     t1):date(day,month,year), time(hours,minute)
      {

         wS = wS;
         sR = sR;
         t =t;
         d1.setDate(day,month, year);
         t1.setTime(hours,minute);
       }
       weather::~weather() {}

       void weather::setWeather(float wS, float sR, float t)
      {
        wSpeed =wS;
        solarRadiation=sR;
        temperature =t;
       }
      void weather::setWspeed(float wS)
       {
        wSpeed =wS;
       }
      void weather::setSolarRadiation(float sR)
      {
       solarRadiation=sR;
      }

      void weather::setTemperature(float t)
      {
       temperature = t;
       }
       void weather::setWeather(float wS,float sR, float t, date d1, time 
       t1)
       {
         wSpeed=wS;
         solarRadiation=sR;
         temperature = t;
       }
       float weather::getWspeed() const
       {
       return wSpeed;
       }
       float weather::getSolarRadiation() const
       {
        return solarRadiation;
       }
       float weather::getTemperature() const
        {
        return temperature;
        }



         ostream& operator<< (ostream& osObject, const weather& weather1)
       {

        osObject << weather1.wSpeed <<"  " << weather1.solarRadiation <<""
        << weather1.temperature <<  weather1.d1 << weather1.t1 ;
        return osObject;
       }
       istream& operator >> (istream& isObject, weather& weather1)
       {
       isObject >> weather1.wSpeed>> weather1.solarRadiation >> 
       weather1.temperature >>  weather1.d1 >> weather1.t1;
       return isObject;
        }

how do i put the values into an object? is it correct i have to use inheritance so i can overload the weather constructor so it can take a date and time class?

Dev2017
  • 857
  • 9
  • 31
ricky
  • 13
  • 5
  • 1
    https://stackoverflow.com/help/mcve – Isaac Mar 06 '18 at 02:33
  • 2
    `class weather: public date, time` -- A `weather` is-a `date` and `time`? – PaulMcKenzie Mar 06 '18 at 02:34
  • 1
    @isaac: The super secret list of comment shortcuts: https://stackoverflow.com/editing-help#comment-formatting For example `[mcve]` expands to [mcve]. – user4581301 Mar 06 '18 at 02:48
  • Note if your destructor doesn't do anything, like `weather::~weather() {}`, you can either safely remove it and its declaration in the class or save yourself some debugging time by making it do what you needed it to do before you find out you left out some code the hard way. Try to adhere to the [Rule of Zero](http://en.cppreference.com/w/cpp/language/rule_of_three) and leave it out where possible. If not possible, make sure you are familiar with the Rules of Three and Five at the same link. – user4581301 Mar 06 '18 at 02:52
  • Helpful reading: [Prefer composition over inheritance?](https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) – user4581301 Mar 06 '18 at 02:54

1 Answers1

0

You almost have it, but...

You do NOT have to inherit to be able to work with a member object. In

class weather: public date, time

: public date, time is not necessary. It also implies the weather is a date and a time which makes no sense. Avoid inheriting unless there is some logical is-a relationship.

weather::weather(float wS, float sR, float t, date d1, time  t1):
    date(day,month,year), // you want the member name now, not the type 
                          // plus where did day month and year come from?
    time(hours,minute) // not ditto, but close enough.
{
     wS = wS; // self assigns. In other word, does nothing
     sR = sR; // ditto
     t =t; // ditto
     d1.setDate(day,month, year); // where did day month and year come from?
     t1.setTime(hours,minute); // not ditto, but close enough.
}

Doesn't really do anything. It mostly has the parameters assigning to themselves. This is pointless because they are the same variable and they are temporary variables. What you want to do is assign to the member variables. This is a constructor, so you might as well use the Member Initializer List all the way through

weather::weather(float wS,
                 float sR,
                 float t,
                 date d1,
                 time t1) :
        wSpeed(wS), 
        solarRadiation(sR), 
        temperature(t), 
        d1(d1), // note this is about the only time you can use the same name twice. 
                // Enjoy it. But don't do it. It confuses people.
        t1(t1)  // ditto
{
}

Then we get down to setWeather

void weather::setWeather(float wS, float sR, float t)
{
    wSpeed =wS;
    solarRadiation=sR;
    temperature =t;
}

Does not match the definition in the class

void setWeather(float wS, float sR, float t,date d1, time t1);

So obviously we want something more like

void weather::setWeather(float wS, float sR, float t, date pd1, time pt1)
{
    wSpeed = wS;
    solarRadiation = sR;
    temperature = t;
    d1 = pd1;
    t1 = pt1;
}

Note I did not repeat d1 in the parameter list. I changed it so I wouldn't have d1 = d1; which does nothing useful. It would be better to give both the member and the parameter more descriptive names. d1 conveys zero information about that the variable is and how it should be used.

user4581301
  • 33,082
  • 7
  • 33
  • 54