Home > Software engineering >  Member function doesn't work when using pointer to class
Member function doesn't work when using pointer to class

Time:06-23

Scenario: I have two classes, each contains a pointer to the other (when using them, being able to refer to the other is going to be important so I deemed this appropriate). When I try accessing a private variable from one class via using the pointer to the other and a getter function inside that, it works perfectly. Problem: Using a setter (in this case, addPoints)/manipulating the variables however leads to no result.

I'm new so anything here might be "improper etiquette" and bad practice. Feel free to point them out! But please also try to provide a solution. This is also my first question on SO, so please be gentle!

Related code pieces:

Team.h

#include "Driver.h"

using namespace std;

class Team {
    int Points = 0;
    vector<Driver*> Drivers;
public:
    void addPoints(int gained); //does not work
    int getPoints(); //works perfectly
    Driver getDriver(int nr);
    void setInstance(vector<Driver*> drivers);
};

Team.cpp

#include "Team.h"
#include "Driver.h"

using namespace std;

void Team::addPoints(int gained) {
    this->Points = this->Points   gained;
}
int Team::getPoints() {
    return this->Points;
}
Driver Team::getDriver(int nr) {
    return *Drivers[nr];
}
void Team::setInstance(vector<Driver*> drivers) {
    this->Drivers = drivers;
}

Driver.h

using namespace std;

class Team;
class Driver {
    int Points = 0;
    Team* DriversTeam;
public:
    void SetTeam(Team& team);
    Team getTeam();
    int getPoints(); //works
    void addPoints(int gained); //doesn't work
};

Driver.cpp

#include "Driver.h"
#include "Team.h"
using namespace std;

void Driver::SetTeam(::Team& team) {
    this->DriversTeam = &team;
}
Team Driver::getTeam() {
    return *DriversTeam;
}
int Driver::getPoints() {
    return this->Points;
}
void Driver::addPoints(int gained) {
    this->Points = this->Points   gained;
}

Initializer.cpp (linking drivers to teams)

void InitializeData(vector<Team>& teams, vector<Driver> &drivers) {
    //(...) 
    //reads each team in from data file to memory

    //key part:
    vector<Driver*> teamsDrivers;
    for (auto& iter : drivers) { //this loop mainly determines which driver to link with which teams
        if (iter.getName().compare(values[4]) == 0) { //values is csv line data in a string vector. I guess not the prettiest parsing method here but will be revised
            teamsDrivers.push_back(&iter);
        }else if(iter.getName().compare(values[5]) == 0) {
            teamsDrivers.push_back(&iter);
        }
    }

    tempTeam.setInstance(teamsDrivers);
    teams.push_back(tempTeam);

}

(linking driver to team)

//drivers are linked to teams last, as they are declared first (so I cannot link them to the yet nonexisting teams)
void LinkTeam(vector<Driver>& drivers, vector<Team>& teams) {
    for (auto& driverIter : drivers) { //iterate through drivers

        for (auto& teamIter : teams) { // iterate through teams
            bool found = 0;
            for (size_t i = 0; i < teamIter.DriverAmount(); i  ) {
                if (driverIter.getName() == teamIter.getDriver(i).getName()) {
                    driverIter.SetTeam(teamIter);
                    found = 1;
                    break;
                }
            }
            if (found) { //exit iterating if driver is found
                break;
            }
        }
    }
}

Example of use in main.cpp

teams[0].addPoints(10);
drivers[3].getTeam().addPoints(15); //driver 3 is linked to team 0

cout << teams[0].getPoints(); //15
cout << drivers[3].getTeam().getPoints(); //15


teams[0].getDriver(1).addPoints(20); //driver 1 of team 0=driver[3]
drivers[3].addPoints(25); 

cout << drivers[3].getPoints(); //25
cout << teams[0].getDriver(1).getPoints(); //25

Thanks for the help in advance.

CodePudding user response:

This is quite simple:

Your getTeam() and getDriver() functions are returning copies of the objects, not references, so the addPoints() are performed on temporary copies and not the real ones.

To fix it, simply change the return types to references (add &):

Team& getTeam();

and

Driver& getDriver();
  • Related