Obiekt przekazany do funkcji ma bledne wartosci.

0

To pewnie glupie pytanie, ale mecze sie z tym od paru godzin, wiec pomyslalem ze warto sprobowac. Stworzylem klase, ktora ma zapisywac obiekty z jednej klasy do tablicy drugiej klasy zgodnie z zasadami kopca binarnego. Problem w tym, ze gdy obiekt trafia do funkcji w ktorej ma zostac zapisany do tablicy to nagle nie posiada on zadnych wczesniej wpisanych wartosci. Myslalem, ze jest to pewnie jakos zwiazane ze sposobem przekazywania obiektu do funkcji, ale swoja przygode z c++ dopiero zaczynam i nie do konca to rozumiem. Z gory dzieki za pomoc.

https://ideone.com/S4IoVE

#include<iostream>
#include<string>
using namespace std;
 
class Car
{
        string nr_;
        int power_;
        double weight_;
        char engine_;
    public:
        Car();
        Car(int);
        ~Car(){}
        string readNr();
        int readPower();
        double readWeight();
        char readChar();
        void writeNr(string);
        void writePower(int);
        void writeWeight(double);
        void writeChar(char);
};
 
class CarHeap
{
        static const int capacity_=6;
        int counter_;
        Car arr_[capacity_];
    public:
        CarHeap();
        friend class Car;
        void adCar (Car);
        void showCar();
        void carEquals(Car,Car);
 
};
 
void CarHeap::carEquals(Car first,Car second)
{
    first.writeNr(second.readNr());
    first.writePower(second.readPower());
    first.writeWeight(second.readWeight());
    first.writeChar(second.readChar());
}
 
void CarHeap::showCar()
{
    cout << "result" << endl;
    for (int i=0;i<counter_;i++)
    {
        cout << arr_[i].readNr() << " " << arr_[i].readPower() << " ";
    }
}
 
void CarHeap::adCar (Car obj)
{
    if (counter_<capacity_)
    {
        int child=counter_++;
        int parent=(child-1)/2;
        cout << obj.readPower() << endl;
        while (child>0&&arr_[parent].readPower()>obj.readPower())
        {
            carEquals(arr_[child],arr_[parent]);
            child=parent;
            parent=(child-1)/2;
        }
        carEquals(arr_[child],obj);
    }
}
 
 
CarHeap::CarHeap() {
    counter_=0;
}
 
int Car::readPower()
{
    return power_;
}
 
string Car::readNr()
{
    return nr_;
}
double Car::readWeight()
{
    return weight_;
}
char Car::readChar()
{
    return engine_;
}
void Car::writeNr(string x)
{
    nr_=x;
}
void Car::writePower(int x)
{
    power_=x;
}
void Car::writeWeight(double x)
{
    weight_=x;
}
void Car::writeChar(char x)
{
    engine_=x;
}
 
 
Car::Car () {
    string nr;
    int power;
    double weight;
    char engine;
    cin >> nr;
    nr_=nr;
 
    cin >> power;
    power_=power;
 
    cin >> weight;
    weight_=weight;
 
    cin >> engine;
    engine_=engine;
 
}
 
 
int main()
{
    CarHeap arr;
    Car a;
    arr.adCar(a);
    Car b;
    arr.adCar(b);
    Car c;
    arr.adCar(c);
    Car d;
    arr.adCar(d);
    Car e;
    arr.adCar(e);
    Car f;
    arr.adCar(f);
    arr.showCar();
 
    return 0;
}
1

carEquals

serio, tak nazwałeś przypisanie? o_O

Poza tym przecież to: carEquals(arr_[child],arr_[parent]); nie ma sensu. Właśnie nadpisałeś wartości i tych starych juz nie ma :( Zastanów się chwilę. Masz coś w stylu:

int x = 1;
int y = 2;

I zrobiłeś teraz:

y = x;

No i co? No i teraz obie zmienne mają wartość 1, a tą 2 zgubiłeś na amen bo nigdzie jej nie zapisałeś. Nie wiem dokładnie jaka jest ta twoja logika dodawania do kopca, bo jest zupełnie nieczytelna, ale zgaduje że nadpisujesz tam wszystko wesoło.

1

Wczytywanie zmiennych umieszczone w konstruktorze powoduje, że wczytywane one są za każdym razem kiedy tworzony jest obiekt klasy Car.
Czyli wtedy kiedy tworzysz obiekt

Car a; // następuje wczytanie danych

oraz wtedy kiedy tworzone są obiekty w tablicy

Car arr_[capacity_]; 

Utwórz sobie funkcję Load w obiekcie Car w której będziesz wczytywał dane.

Poza tym w tej chwili funkcja carEquals niczego nie zmienia, gdyż operuje na zmiennych tymczasowych (lokalnych).

0
TomaszLiMoon napisał(a):

Wczytywanie zmiennych umieszczone w konstruktorze powoduje, że wczytywane one są za każdym razem kiedy tworzony jest obiekt klasy Car.
oraz wtedy kiedy jest tworzony obiekt tymczasowy w funkcji

void CarHeap::adCar (Car obj) // tutaj też wczytywane są dane bo tworzony jest obiekt tymczasowy obj

oraz podwójnie dla

void CarHeap::carEquals(Car first,Car second) // tutaj wczytywane są dane dla dwóch obiektów typu Car

Utwórz sobie funkcję Load w obiekcie Car w której będziesz wczytywał dane.

W tych dwóch przypadkach konstruktor się nie odpala (odpala się konstruktor kopiujący).
Aczkolwiek zgadzam się wczytywanie w konstruktorze to absurd.

0
TomaszLiMoon napisał(a):

Wczytywanie zmiennych umieszczone w konstruktorze powoduje, że wczytywane one są za każdym razem kiedy tworzony jest obiekt klasy Car.
Czyli wtedy kiedy tworzysz obiekt

Car a; // następuje wczytanie danych

oraz wtedy kiedy jest tworzony obiekt tymczasowy w funkcji

void CarHeap::adCar (Car obj) // tutaj też wczytywane są dane bo tworzony jest obiekt tymczasowy obj

oraz podwójnie dla

void CarHeap::carEquals(Car first,Car second) // tutaj wczytywane są dane dla dwóch obiektów typu Car

Utwórz sobie funkcję Load w obiekcie Car w której będziesz wczytywał dane.

Do tego miala wlasnie sluzyc funkcja readPower(). Patrzac po paru przykladach w internecie wydaje mi sie, ze sposob w jaki to robie powinien dzialac.
Patrzac po tym przykladzie: https://www.geeksforgeeks.org/passing-and-returning-objects-in-c/ jedyne co chce zrobic to zamiast odczytac wartosc z publicznej czesci klasy, to uzyc funkcji by odczytac ja z prywatnej.

0

Dobra juz dalem rade, tworzenie po jednym obiekcie w loopie to bylo rozwiazanie mojego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1