C++ przeładowanie operatora+

0

Witam
Mam takie zadanie do zrobienia aby utworzyć klasę przechowującą ciąg znakowy która dysponuje kilkoma metodami, mam problem z jedną z nich.

Chodzi o przeładowanie operatora + jako zaprzyjaźniona funkcja globalna który ma łączyć dwa ciągi które są polami tej klasy.
Przez tą linijkę w main.cpp: D = A + B + "_cos_";
Dostaje taki błąd: error: 'char* operator+(char*, char*)' must have an argument of class or enumerated type
Tak wygląda ta funkcja:

char* operator+(char *A,char *B)
{
    strcat(A,B);

    return A;
}

Ktoś ma jakiś pomysł jak to rozwiązać?

5

Podpowiedź jest w opisie błędu. W C++ nie można przeładowywać operatorów dla typów wbudowanych (takich jak char*) - przynajmniej jeden z argumentów musi mieć typ zdefiniowany przez użytkownika.

Poza tym, bardzo niefajny pomysł, żeby modyfikować argument w operatorze + (takie rzeczy to by przeszły, gdybyś chciał napisać operator +=).

2
enedil napisał(a):

Podpowiedź jest w opisie błędu. W C++ nie można przeładowywać operatorów dla typów wbudowanych (takich jak char*) - przynajmniej jeden z argumentów musi mieć typ zdefiniowany przez użytkownika.

Poza tym, bardzo niefajny pomysł, żeby modyfikować argument w operatorze + (takie rzeczy to by przeszły, gdybyś chciał napisać operator +=).

W ogóle, gdyby formalnie nawet się dało, na char * to bardzo kiepski pomysł.. Kolega wdepnie w przejeżdzanie bufora, problemy z modelem pamięci (pierwszy argument statyczny, drugi argument alokowany) itd Obiektowa "obudowa" bardzo przyjemnie ukryje błędy, aż do segfault.

1

Aby zadziałało powyższe łączenie, powinieneś dodać konstruktor przyjmujący obiekty typu const char* , co w efekcie umożliwi niejawną ich konwersję do obiektu uwzględnionego w przeładowanym operatorze. Zobacz:

#include <iostream>

using namespace std;

class TestWrapper
{

public:

    TestWrapper( const char* text ): text_ {text} {}
    TestWrapper( string text ): text_ {move(text)} {}

    string text() const { return text_; }

    friend TestWrapper operator+( const TestWrapper& A , const TestWrapper& B )
    {
        return { A.text_ + B.text_ };
    }

private:

    string text_;
};


int main()
{
    TestWrapper A {"Ala"};
    TestWrapper B {" ma"};

    auto D = A + B + " kota";

    cout << D.text() << "\n";

    return 0;
}
2
BigZ25 napisał(a):
char* operator+(char *A,char *B)
{
    strcat(A,B);

    return A;
}

Ktoś ma jakiś pomysł jak to rozwiązać?

Nie wyważać otwartych drzwi.
Cały problem polega na tym, że masz w głowie za dużo C a za mało C++.

Od tego jest std::string.
Na dodatek jest namespace std::listerals.

    using namespace std::literals;
    
    auto s = "Foo"s + "bar"s;
    std::cout << s << std::endl;

https://wandbox.org/permlink/JlJhwIHKajRC2vwb

Mam takie zadanie do zrobienia aby utworzyć klasę przechowującą ciąg znakowy która dysponuje kilkoma metodami, mam problem z jedną z nich.

To pokaż tą klasę i wymagania jakie masz do tej klasy. Przeciążenie operatora, które pokazałeś, nawet nie wymienia nazwy twojej klasy, co powinno być sygnałem, że twoje podejście nie ma nic wspólnego, z twoim zadaniem.

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