Dlaczego klasa wyświetla złą wartość

Odpowiedz Nowy wątek
2017-12-29 00:50
0

Dlaczego po przypisaniu wartości do tablicy klas, przypisało się 0 z klasy bazowej a nie 1? z klasy pochodnej jak zostało przekazane

#include <iostream>
using namespace std;

class Towar {
public:
    int i;
    Towar(int i = 0)
        : i(i){};
};

class Towar_poch : public Towar {
public:
    int i;
    Towar_poch(int i = 1)
        : i(i){};
};
class koszyk {
public:
    Towar object[4];
    koszyk(Towar object1, Towar object2)
    {
        object[0] = object1;
        object[1] = object2;
        cout << object[0].i << endl;
        cout << object[1].i << endl;
    };
};

int main(int argc, char** argv)
{
    Towar object;
    Towar_poch object2;
    koszyk object3(object, object2);

    return 0;
}

tutaj tak samo: (bo prubuje zobaczyć różnicę między przekazywaniem przez adres, a po prostu wprost )

#include <iostream>
using namespace std;

class Towar {
public:
    int i;
    Towar(int i = 4)
        : i(i){};
    virtual void name()
    {
        cout << "f";
    };
};

class Towar_poch : public Towar {
public:
    int i;
    Towar_poch(int i = 1)
        : i(i){};
    void name()
    {
        cout << "f";
    }
};
class koszyk {
public:
    Towar* object[4];
    koszyk(Towar* object1, Towar* object2)
    {
        object[0] = object1;
        object[1] = object2;
        cout << object[0]->i << endl;
        cout << object[1]->i << endl;
    };
};

int main(int argc, char** argv)
{
    Towar object;
    Towar_poch object2;
    koszyk object3(&object, &object2);

    return 0;
}

Pozostało 580 znaków

2017-12-29 01:35
0
bartek164 napisał(a):

Dlaczego po przypisaniu wartości do tablicy klas, przypisało się 0 z klasy bazowej a nie 1? z klasy pochodnej jak zostało przekazane

Bo w Twoim przypadku Towar::i i Towar_poch::i to dwie różnie zmienne. W konstruktorze klasy pochodnej nie wywołujesz konstruktora klasy bazowej.

bartek164 napisał(a):

tutaj tak samo: (bo prubuje zobaczyć różnicę między przekazywaniem przez adres, a po prostu wprost )

Jak przekazujesz coś przez adres(wskaźnik/referencje) to działasz na oryginale. Jak przekazujesz przez wartość to działasz na kopii, czyli wszelkie zmiany jakich dokonasz nie są uwzględniane w obiekcie z którego kopia jest stworzona.


Wole wizerunek z nożem w zębach, przejść po trupie
Niż zgrywać ćwierćinteligenta z piórkiem w d.

Pozostało 580 znaków

2017-12-29 01:55
0

tutaj jest temat, zle mi sie wpisało
Czemu się nie moge odwołać do obiektu j klasy pochodnej?, przecież przkazałem adres tej klasy
class towar has no member named ;
wiem, ale skoro towar_poch został przkazany do wskażnika no to .....

#include <iostream>
using namespace std;

class Towar {
public:
    int i;
    Towar(int i = 4)
        : i(i){};
    virtual void name()
    {
        cout << "f";
    };
};

class Towar_poch : public Towar {
public:
    int j;
    Towar_poch(int i = 1)
        : j(i){};

};
class koszyk {
public:
    Towar* object[4];
    koszyk(Towar* object1, Towar* object2)
    {
        object[0] = object1;
        object[1] = object2;
        cout << object[0]->i << endl;
        cout << object[1]->j << endl;
    };
};

int main(int argc, char** argv)
{
    Towar object;
    Towar_poch object2;
    koszyk object3(&object, &object2);

    return 0;
}

i czemuż to nie działa?:

#include <iostream>
using namespace std;

class Towar {
protected:
    string nazwa;

public:
    virtual void sprzedaj();

    Towar(string nazwa)
        : nazwa(nazwa)
    {
    }
};

void Towar::sprzedaj()
{
    cout << "Sprzedarz " << nazwa << endl;
}

class Towar_z_Gwarancja : public Towar {
protected:
    string podbicie_gwarancji;

public:
    void sprzedaj();
    Towar_z_Gwarancja(string nazwa, string podbicie_gwarancji)
        : Towar(nazwa)
        , podbicie_gwarancji(podbicie_gwarancji){};
};

void Towar_z_Gwarancja::sprzedaj()
{
    Towar::sprzedaj();
    cout << ".Podbicie gwarancji\n";
}

class Koszyk {
public:
    int i;
    Towar koszyk[10];

    Koszyk(int i = 0)
        : i(i){};

    void Dodaj_Towar_do_Koszyka(Towar towar)
    {
        if (i <= 9) {
            koszyk[i] = towar;
            ++i;
        }
    }
};

int main(int argc, char** argv)
{

    Towar towarek1("jablko");
    Towar_z_Gwarancja towarek2("sok", "3.11.1997");
    Koszyk koszyk1;
    koszyk1.Dodaj_Towar_do_Koszyka(towarek1);
    koszyk1.Dodaj_Towar_do_Koszyka(towarek2);

    return 0;
}
Przekazaleś adres obiektu klasy pochodnej. A dokładniej : Do konstruktora koszyk przekazujesz adres na wskaźnik klasy towar w której nie istnieje zmienna j. Dla tego nie ma do niej dostępu. Możesz podać adres klasy pochodnej bo jest ona częściowo identyczna ale do pola rozszerzenia nie ma dostępu. Może że czegoś nie wiem. - elradziu 2017-12-29 10:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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