jak przeciążyć operator+

2016-10-25 14:00

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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;
}
edytowany 4x, ostatnio: kq, 2016-10-25 14:11

Pozostało 580 znaków

2016-10-25 14:14

Rejestracja: 8 lat temu

Ostatnio: 1 dzień temu

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

edytowany 1x, ostatnio: fasadin, 2016-10-25 14:16

Pozostało 580 znaków

2016-10-25 14:24

Rejestracja: 6 lat temu

Ostatnio: 1 tydzień temu

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ą?

edytowany 1x, ostatnio: twonek, 2016-10-25 14:26

Pozostało 580 znaków

2016-10-25 15:04

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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.

edytowany 2x, ostatnio: cantdoanything, 2016-10-25 15:05

Pozostało 580 znaków

2016-10-25 15:13

Rejestracja: 6 lat temu

Ostatnio: 1 tydzień temu

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ą.

Pozostało 580 znaków

2016-10-25 15:32

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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.

edytowany 2x, ostatnio: cantdoanything, 2016-10-25 15:41

Pozostało 580 znaków

2016-10-25 15:47

Rejestracja: 6 lat temu

Ostatnio: 1 tydzień temu

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+

Pozostało 580 znaków

2016-10-25 15:50

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

0

Ijjaaaaaaa dziala O.O <3

Pozostało 580 znaków

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