thedafferg
thedafferg

Reputation: 99

Set and get methods in a class for objects

I have a class Result which takes two other classes UNIT and Date as object parameters, so that I can store the values in them for use in those classes. I will put down what Ive got so far, and a few of the errors I get are as follows.

error: prototype for 'int Result::GetUnit() const' does not match any in class 'Result'|
lab2\Result.h|17|error: candidate is: Result Result::GetUnit() const|
lab2\Result.cpp|66|error: prototype for 'int Result::GetDate()' does not match any in class 'Result'|
lab2\Result.h|18|error: candidate is: Result Result::GetDate() const|
lab2\Result.cpp|73|error: 'SetResult' was not declared in this scope|
error: 'SetResult' was not declared in this scope|

For the error not declared in this scope, after researching I understand that I need to define the functions before the first call is made. I have done that in the .cpp file but I still get the error. What am I doing wrong?

Result.h:

#ifndef RESULT_H
#define RESULT_H

#include <iostream>
#include <string>
#include "UNIT.h"
#include "Date.h"


//const unsigned ResultSize = 10;
using namespace std;
class Result
{
    public:
        Result(){};
        Result(UNIT unitobj1, unsigned marks1, Date dateobj1);
        Result GetUnit() const;
        Result GetDate() const;
        void SetDate(Date dateobj1);
        void SetUnit(UNIT unitonj1);
        void SetMarks( unsigned marks1 );
        unsigned GetMarks() const;

        void SetCredits( unsigned cred );
        unsigned GetCredits() const;

        string GetID() const;
        void SetID(string idd);


        void SetResult(istream & input);
        void GetResult(ostream & os);//unsigned GetUnit() const;


    private:

        UNIT unitobj;
        Date dateobj;
        string id;
        int credits;
        unsigned marks;

};
inline unsigned Result::GetCredits() const
{
  return credits;
}

ostream & operator <<( ostream & os, const Result & S);
istream & operator >>( istream & input, Result & S);

#endif // RESULT_H

Result.cpp:

#include "Result.h"
#include "UNIT.h"
#include "Date.h"

Result::Result(UNIT unitobj1, unsigned marks1, Date dateobj1)
{

    unitobj = unitobj1;
    marks = marks1;
    dateobj = dateobj1;

}

void Result::SetResult(istream &input){

    UNIT unitobj1;
    unsigned marks1;
    Date date1;

    input >> unitobj1 >> marks1 >> date1;

    SetUnit(unitobj1);
    SetMarks(marks1);
    SetDate(date1);

}



void Result::GetResult(ostream &os){

    os << GetUnit() < "  Marks: " << GetMarks() << '\n' << GetDate() << '\n';

}

void Result::SetUnit(UNIT unitobj1){

    unitobj = unitobj1;

}

void Result::SetMarks(unsigned marks1){

    marks = marks1;

}

void Result::SetDate(Date dateobj1){

    dateobj = dateobj1;

}

Result::GetUnit() const{

    return unitobj;

}

inline unsigned Result::GetMarks() const{

    return marks;

}

Result::GetDate(){

    return dateobj;

}
istream & operator >>( istream & input, Result & S)
{
      SetResult(input);
      return input;

}

ostream & operator <<( ostream & os, const Result & S)
{
      GetResult(os);
      return os;
}

Date.h:

#if !defined(_DATE_H)
#define _DATE_H

#include <iostream>
#include <string>

using namespace std;

class Date {
public:
    Date();
    Date(unsigned day1, string month1, unsigned year1);

    void SetDay(unsigned day1);
    void SetMonth(string month1);
    void SetYear(unsigned year1);
    unsigned GetDay() const;
    string GetMonth() const;
    unsigned GetYear() const;

    void SetDate(istream &input);
    void GetDate(ostream & os);


private:

    unsigned day;
    string month;
    unsigned year;

};

 ostream & operator <<(ostream & os, const Date & D);
 istream & operator >>(istream & input, Date & D);
#endif  //_DATE_H

Date.cpp:

//
//
//  Generated by StarUML(tm) C++ Add-In
#include "Date.h"

Date::Date(unsigned day1, string month1, unsigned year1) {

    day = day1;
    month = month1;
    year = year1;

}


void Date::SetDay(unsigned day1) {

    day = day1;

}

void Date::SetMonth(string month1) {

    month = month1;

}

void Date::SetYear(unsigned year1) {

    year = year1;

}

inline unsigned Date::GetDay() const {

    return day;

}

string Date::GetMonth() const {

    return month;

}

inline unsigned Date::GetYear() const {

    return year;

}
void Date::SetDate(istream &input){

    unsigned day1;
    string month1;
    unsigned year1;


    input >> day1 >> month1 >> year1;
    SetDay(day1);
    SetMonth(month1);
    SetYear(year1);

}

void Date::GetDate(ostream &os){

    os << "  Date: " << GetDay() << " " << GetMonth() << " " << GetYear();

}


istream & operator >>( istream & input, Date & D) {

    SetDate(input);
    return input;

}

ostream & operator <<( ostream & os, const Date & D) {

    GetDate(os);

    return os;

}

UNIT.h:

        #ifndef UNIT_H
        #define UNIT_H

        #include <iostream>
        #include <string>  // C string library

        using namespace std;



        const unsigned UnitNameSize = 10;

        class UNIT
        {
        public:
          UNIT();
          UNIT( string nam, string idd, unsigned cred);

          void SetName(string nam);
          string GetName() const;

          void SetMarks(unsigned marks1);
          unsigned GetMarks();

          void SetCredits(unsigned cred);
          unsigned GetCredits() const;

          string GetID() const;
          void SetID(string idd);

          void SetUnit(istream & input);
          void GetUnit(ostream & os);

        private:


          string name;  
          string id;   
          unsigned marks;
          int credits;
        };

        ostream & operator <<( ostream & os, const UNIT & U);
        istream & operator >>( istream & input, UNIT & U);



        #endif // UNIT_H

UNIT.cpp:

#include "UNIT.h"
#include <string>

UNIT::UNIT()
{
  name[0] = '\0';
}

void UNIT::SetName(string nam)
{
  name = nam;
}


string UNIT::GetName() const
{
  return name;
}

void UNIT::SetID(string idd)
{
  id = idd;
}


string UNIT::GetID() const
{
  return id;
}

void UNIT::SetCredits(unsigned cred){

    credits = cred;

}

inline unsigned UNIT::GetCredits() const{

    return credits;

}
UNIT::UNIT( string nam, string idd,
                unsigned cred)
{
  name.replace(0, 10, nam );
  id = idd;
  credits = cred;
}

void UNIT::SetUnit(istream &input){

  string nam;
  string idd;
  unsigned cred;

  getline(input,nam, '\n');
  getline(input,idd,'\n');
  input >> cred;

  SetName(nam);
  SetID(idd);
  SetCredits(cred);

}

void UNIT::GetUnit(ostream & os){

  os << "  Unit ID:  " << GetID() << '\n'
     << "  Unit Name: " << GetName() << '\n'
     << "  Credits: " << GetCredits() << '\n';

}


istream & operator >>( istream & input, UNIT & U)
{
  SetUnit(input);

  return input;
}

ostream & operator <<( ostream & os, const UNIT & U)
{
  GetUnit(os);
  return os;
}

Note: I know that I can just make the overloaded operators methods of the class and declare them as friends, but I am trying to achieve this by using set and get methods. Any help would be very appreciated!

Upvotes: 0

Views: 595

Answers (1)

john
john

Reputation: 87959

So, this is pretty straightforward, look at Result::GetUnit

Result::GetUnit() const {
    return unitobj;
}

This method is missing a return type. Now look at unitobj

UNIT unitobj;

So it's clear that the return type should be UNIT, so the above method should be defined as

UINT Result::GetUnit() const {
    return unitobj;
}

Now look at how you declared this method in your class

class Result
{
    ...
    Result GetUnit() const;

Here you gave it a return type of Result where we've already seen that the return type should be UINT, so change the above to

class Result
{
    ...
    UNIT GetUnit() const;

Result::GetDate has similar problems, here the return type should be Date but again you specified it as Result.

For the SetResult error you simply need to specify that you are calling the SetResult method on a Result object. The compiler thinks you are calling a global SetResult function (which doesn't exist)

Like this

istream & operator >>( istream & input, Result & S)
{
      S.SetResult(input);
      return input;
}

S.SetResult(input); tells the compiler that you want to call the SetResult method using the Result object refered to by S.

You can tell this by reading the error message carefully, it said 'SetResult' was not declared in this scope, not 'Result::SetResult' was not declared in this scope. As you said you have declared Result::SetResult, but your code wasn't calling that, it was trying to call a different function called SetResult and the compiler correctly reported that no such function was declared.

Upvotes: 3

Related Questions