error: no match for ‘operator*’ (operand type is ‘A’)

0
#include <iostream>

using namespace std;

class A
{
public:
    void f(){cout<<"arbuz"<<endl;};
};

class SmartPtr
{
public:
    A *ptr{nullptr};
    A *fTable[5]{nullptr};
    int fUse{0};

    A *operator->()
    {
        fTable[fUse] = ptr;
        fUse = (++fUse) % 5;
        return ptr;
    }
    A &operator*()
    {
        return *(operator->());
    }
};

int main()
{
    A a;
    SmartPtr wsk;
    wsk=*a;
    (*wsk).f();
}

Cześć, mógłby ktoś wytłumaczyć dlaczego w int main() w linice wsk=*a; występuje błąd:

main.cpp:34:9: error: no match for ‘operator*’ (operand type is ‘A’)
   34 |     wsk=*a;
      |         ^~
1

Wołasz operator * na instancji klasy A, która nie ma tego operatora przeładowanego. Operatory przeładowałeś tylko dla SmartPtr. Brakuje Ci też przeładowanego operatora = w SmartPtr żeby to mogło zadziałać.

0

Faktycznie, dostałem nazwijmy to gotowy kod w poleceniu w którym miałem właśnie klase A i int main. Czyli żeby całość działała poprawnie muszę przeciążyć operator -> i * w klasie A i dodatkowo przeciążyć operator= ?

0

Jeżeli chciałbyś imitować inteligentny wskaźnik to SmartPtr powinien dostać adres zasobu, także operator * w klasie A nie powinien być Ci potrzebny a przypisanie powinno odbyć się w tej sposób: wsk = &a;. Co pozostawia Cię z koniecznością przeładowania operator = w SmartPtr.

Tym nie mniej całość nie przypomina faktycznego inteligentnego wskaźnika, jako, że przypisujesz tutaj adres do zasobu znajdującego się na stosie, także w obszarze pamięci automatycznej, więc Twój inteligentny wskaźnik nie może de facto wykonać żadnego zarządzania zasobem i w dodatku po automatycznym zwolnieniu instancji A pozostaniesz z wiszącym wskaźnikiem.

0

Dzięki za taki opis, dostałem zadanie w którym chodziło żeby w oparciu o slajdy z wykładu napisać właśnie taką klasę. Teraz rozumiem w czym polegał problem i ciężko się z tobą nie zgodzić że faktycznie daleko do inteligentnego wskaźnika.

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