jak przeciążyć operator+

0

Mam zrobic cos takiego:

Napisz klasę Gitara do przechowywania
informacji o gitarach
• Napisz klasę Magazyn, która wewnętrznie
będzie przechowywać tablicę Gitar
• Przeciąż operatory „+” i „-” tak aby za pomocą
tych operatorów było można dodawać i
usuwać Gitary z Magazynu
• Do definicji co najmniej jednego operatora
wykorzystaj słowo kluczowe friend

Otoz, chcialem zrobic vector gitar w magazynie. Co sie dzieje:

  • dodawanie funkcją add dziala, nie dziala operator +. Tzn program sie wywala po wywolaniu mag2+b; Jak sobie zawartosc wektora wyswietle w "Magazyn Magazyn::operator +" to mi wyswietli, ze dodal obiekt, tylko pozniej program przestaje odpowiadac.
  • jak chce zrobic dziedziczenie w klasie magazyn po klasie gitar czyli "class Magazyn:public Gitara{" to: main.cpp|31|error: no matching function for call to 'Gitara::Gitara()'|
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

class Gitara{
protected:
    string NazwaGit;
public:
        Gitara(string _name): NazwaGit(_name) {};

    void ustaw_wartosci(string name)
    {
        NazwaGit = name;
    }

    void infogitara()
    {
        cout << NazwaGit << " Gitara" << endl;

    }

};


class Magazyn{
protected:
    //string NazwaMag;
    vector <Gitara> Tablica;
public:

    Magazyn operator+ (Gitara Name);

    void info()
    {
            for (int y=0; y<Tablica.size(); y++){
            Tablica[y].infogitara();
        }
    }

    void add(Gitara Name){
        Tablica.push_back(Name);
    }
};

Magazyn Magazyn::operator + (Gitara Name){

    Tablica.push_back(Name);
}



int main()
{
    string Nazwa;
    cin >> Nazwa;

    Magazyn mag2;
    Gitara b = *new Gitara(Nazwa);
    b.infogitara();
    mag2+b;
    mag2.info();

    return 0;
}

1

przeczytaj ten artykul
http://en.cppreference.com/w/cpp/language/rule_of_three

blad masz taki ze nie masz bezparametrowego konstruktora w gitarze.

Mozesz to rozwiazac na dwa sposoby. Zdefiniowac bezparametrowy konstruktor lub uzyc tego
http://en.cppreference.com/w/cpp/container/vector/emplace_back

3
Gitara b = *new Gitara(Nazwa);

Co to za okropny zapis? Już na start fundujesz sobie wyciek pamięci.

Gitara b(Nazwa);

prościej i przyjemniej

Magazyn operator+ (Gitara Name);

Jak nie masz szczególnego powodu, to parametry przekazuj nie przez wartość, tylko stałą referencję. Unikniesz niepotrzebnego kopiowania oraz innych potencjalnych problemów.

Magazyn operator+ (const Gitara& Name);

jak chce zrobic dziedziczenie w klasie magazyn po klasie gitar
Dlaczego? Magazyn jest gitarą?

0

emplace_back w ogole mi nie lapie, nie dziala.

Nie do konca rozumiem chyba to rule of three i of five.

Bezparametrowy konstruktor probowalem zdefiniowac:

 Gitara(){};
        //Gitara(const Gitara&);//: {};
        Gitara(string _name): NazwaGit(_name) {};
        //Gitara(Gitara&& other): NazwaGit(move(other.NazwaGit)) {};

Ale nic sie nie zmienilo, program przestaje odpowiadac.

Chodzi o to, ze powinienem zdefiniowac konstruktor kopiujacy zeby push_back normalnie dzialalo?
W metodzie dziala bez tego.

Prepraszam, ale sie gubie :/

const Gitara& Name
a nie
Gitara& Name

Chciałem, zeby to mialo jakas herarchie dlatego magazyn mial dziedziczyc po gitarze.

2
Magazyn Magazyn::operator+(Gitara Name)
{
    Tablica.push_back(Name);
}

Deklarujesz, że funkcja zwraca obiekt typu Magazyn, a nigdzie nie ma return, więc masz undefined behaviour.

Chciałem, zeby to mialo jakas herarchie dlatego magazyn mial dziedziczyc po gitarze.
Lepiej nie mieć hierarchii, niż taką bezsensowną.

0
twonek napisał(a):

Deklarujesz, że funkcja zwraca obiekt typu Magazyn, a nigdzie nie ma return, więc masz undefined behaviour.

Ale jak niby ma zwracac obiekt typu 'Magazyn'?
Nie wiem w takim razie w jaki sposob mam zmienic to zeby to poprawnie dzialalo.

Mam cos takiego:

Magazyn Magazyn::operator+ (const Gitara& Name){

    Tablica.push_back(Name);
}

Nie moge zrobic return Tablica bo to jest 'vector' nie 'Magazyn'. Jedyne co to to mi przychodzi do glowy:

 Magazyn Magazyn::operator+ (const Magazyn& Mag, const Gitara& Name){

    Mag.Tablica.push_back(Name);
    return Mag;
}

ALE wtedy

main.cpp|54|error: 'Magazyn Magazyn::operator+(const Magazyn&, const Gitara&)' must take either zero or one argument|

albo

 Magazyn Magazyn::operator+ (const Gitara& Name){

Magazyn Mag;
    Mag.Tablica.push_back(Name);
    return Mag;
}

Ale tutaj jest tworzony nowy magazyn za kazdym razem wykonania wiec bez sensu.

1

Ale jak niby ma zwracac obiekt typu 'Magazyn'?
Na przykład tak:

Magazyn Magazyn::operator+(Gitara Name)
{
    Tablica.push_back(Name);
    return *this;
}

Aczkolwiek jeśli i tak z tego nie korzystasz, to po prostu nic nie zwróć

void Magazyn::operator+
0

Ijjaaaaaaa dziala O.O <3

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