Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] - Ridefinizione Operatori->HELP()

    Buonasera, come sempre mi rivolgo a tutti voi e ringrazio tutti in anticipo. Chiedevo aiuto sul seguente problema: avendo una mia classe dichiarata in un header come:

    codice:
    namespace Geometrics{
        class Point{
            public:
                //... costruttori, distruttore, etc...
                const Point *operator=(const Point *_p);
                void set_x(double _x);
                void set_y(double _y);
                double get_x();
                double get_y();
                //... altre funzioni...
            private:
                double *x;
                double *y;
        };
    }
    e imprementata in un sorgente come:

    codice:
    //...
    const Geometrics::Point *Geometrics::Point::operator=(const Geometrics::Point *_p){
        this->set_x(_p->get_x());
        this->set_y(_p->get_y());
    }
    void Geometrics::Point::set_x(double _x){
        *(this->x) = _x;
    }
    void Geometrics::Point::set_y(double _y){
        *(this->y) = _y;
    }
    double Geometrics::Point::get_x(){
        return *(this->x);
    }
    double Geometrics::Point::get_y(){
        return *(this->y);
    }
    //...
    vorrei che, quando dichiaro due puntatori ad oggetto:

    codice:
    //... dichiarazioni, main(), etc..
    Geometrics::Point *p1 = new Geometrics::Point(1.1, 1.1);
    Geometrics::Point *p2 = new Geometrics::Point(2.2, 2.2);
    assegnando p2 a p1

    codice:
    p1 = p2;
    venisse chiamato l'operatore da me ridefinito... Ma chiaramente ciò non accade! ...
    se invece esplicitamente chiamo l'operatore con questa sintassi:

    codice:
    p1->operator=(p2);
    tutto viene eseguito alla perfezione... Gentilmente chiedo quindi, c'è qualcosa che dimentico nel codice? Ringrazio di nuovo in anticipo chiunque abbia voglia di darmi una spiegazione,
    Saluti,
    Giuseppe
    Ultima modifica di milazzo.g; 28-04-2014 a 19:01

  2. #2
    non hai messo il return nell'overload dell'operatore
    Ultima modifica di maluz1; 28-04-2014 a 21:46

  3. #3
    L'operatore che hai definito opera su oggetti di tipo Geometrics::Point, ma tu stai facendo un assegnamento tra puntatori a Geometrics::Point (e l'assegnamento tra puntatori non è ridefinibile, per ovvi motivi). Se vuoi che l'assegnamento funzioni effettualo tra due oggetti:
    codice:
    Geometrics::Point *p1 = new Geometrics::Point(1.1, 1.1);
    Geometrics::Point *p2 = new Geometrics::Point(2.2, 2.2);
    *p1=*p2;
    O, molto meglio:
    codice:
    Geometrics::Point p1(1.1, 1.1);
    Geometrics::Point p2(2.2, 2.2);
    p1=p2;
    dato che non mi pare abbia alcun senso allocare questi due oggetti nell'heap (se vieni da Java, in C++ new si usa molto più di rado).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    (e l'assegnamento tra puntatori non è ridefinibile, per ovvi motivi). Se vuoi che l'assegnamento funzioni effettualo tra due oggetti:
    Pensavo fosse possibile ridefinirlo! Grazie infinite, cambio tutto quindi con
    codice:
    const Point &operator=(const Point &_p);
    //...
    const Geometrics::Point &Geometrics::Point::operator=(const Geometrics::Point &_p){
        this->set_x(_p.get_x());
        this->set_y(_p.get_y());
        return *this;
    }
    e utilizzo come:

    codice:
    *p1 = *p2;

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.