Problem z konstruktorem kopiującym – nie mogę zmieniać nic w mainie ani w funkcji

0
#include <iostream>

using namespace std;
class Stos {
public:
    int* element;
    int wierzcholek;
    int rozmiar;

    Stos(const Stos& s)
    {
        rozmiar = s.rozmiar;
        wierzcholek = s.wierzcholek;
        element = new int[s.rozmiar];
        *element = *s.element;
        cout << "Wywolanie Konstruktora Kopiującego:" << this << endl;
    }

    Stos()
    {
        element = new int[10];
        rozmiar = 10;
        wierzcholek = -1;
        cout << endl
             << "wywoluje konstruktor domyslny i pisze adres:" << this << endl;
    }

    Stos(int x)
    {
        element = new int[x];
        rozmiar = x;
        wierzcholek = -1;
        cout << endl
             << "wywoluje konstruktor z rozmiaremi pisze adres:" << this << endl;
    }

    ~Stos()
    {
        delete[] element;
        cout << endl
             << "wywoluje destruktor i pisze adres:" << this << endl;
    }
    void push(int liczba)
    {
        if (wierzcholek != rozmiar) {
            wierzcholek++; // cout<<"wypisz wierzcholek:"<<wierzcholek<<endl;
            element[wierzcholek] = liczba;
        }
        else {
            cout << "nie mozna dodac,stos pelny" << endl;
        }
    }
    int top()
    {
        return element[wierzcholek];
    }

    void pop()
    {

        element[wierzcholek] = NULL;
        wierzcholek--;
    }

    int empty()
    {
        if (wierzcholek == -1)
            return 1;
        else
            return 0;
    }
};

void dodaj(Stos s, int a)
{
    s.push(a);
}

int main()
{
    Stos s;
    s.push(0);
    //s.push(1);
    //s.push(2);
    dodaj(s, 1); // wywolanie konstruktora kopiującego
    dodaj(s, 2); // wywolanie konstruktora kopiującego
    while (!s.empty()) {
        cout << s.top();
        s.pop();
    }
    return 0;
}

Mam ogromny problem z napisaniem konstruktora. Nie mogę zmieniać nic w mainie anie w funkcji dodaj.

1

*element=*s.element; to jest skopiowanie wskaźnika pierwszego elementu tablicy, nie całej tablicy która znajduje się pod wskaźnikiem. Potrzebujesz http://en.cppreference.com/w/cpp/algorithm/copy

1

Co ten program ma robić? Ta funkcja dodaj to jakaś bzdura, zmiany dokonywane są na kopii kontenera.

0

Moi drodzy. Właśnie o to chodzi, to ma wypisać 210 czyli wartości ze stosu. Gdyby przekazywane wartosci wszystkie przez
s.push(wartosc)
to wtedy wszystko byloby ok i pisanie konstruktora kopiujacego nie byloby potrzebne

2

Zdajesz sobie sprawę, że idiomatycznie, jak operacji dokonasz na kopii, to oryginał nie zmieni się?

0

Czyli nie ma innego sposobu niż dopisanie do funkcji „&”?
Void dodaj(Stos &s,int a) ? To jest jedyna mozliwość? Pani inżynier z tego przedmiotu mowi, źe się da xd postaram się jutro wyslać poprawne rozwiązanie zadania jeżeli jest ktoś zainteresowany.

0

Poprawne rozwiązanie to przekazanie przez referencję. Możesz przekazać przez wskaźnik. Możesz też złamać wszelkie reguły i zrobić z klasy Stos jakiś głupi handle na współdzieloną pamięć - wtedy można to zrobić bez modyfikacji funkcji dodaj. Ale w żaden sposób nie nazwałbym tego poprawnym.

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