Copy Constructor private e funzione friend

di il
3 risposte

Copy Constructor private e funzione friend

Il seguente programma C++ non viene compilato.
Il compilatore dice che il Copy costruttore privato
della classe Dummy
non puo' essere invocato dalla funzione DoSomething
per la creazione del suo oggetto-parametro ob,
pur essendo la funzione friend della classe Dummy.
(stessa risposta dal compilatore g++ di Linux-Fedora
e dal compilatore clang++ di MacBook Pro)
Come mai? Su quale libro/manuale C++ e' contemplata
una situazione del genere?
Ringrazio chi vorra' autarmi a capire questo errore.

Vito Di Blas


#include <iostream>
using namespace std;

class Dummy {
private:
Dummy(Dummy &source) {}
public:
Dummy(int value) {}
friend void DoSomething(Dummy ob);
};

void DoSomething(Dummy ob)
{ cout << "I'm here!" << endl; }

int main(void) {
Dummy o1(123);
DoSomething(o1);
return 0;
}

3 Risposte

  • Re: Copy Constructor private e funzione friend

    In via alternativa una soluzione potrebbe essere anche questa:
    class Dummy {
    private:
    	Dummy(Dummy &source) {}
    public:
    	Dummy(int value) {}
    	friend void DoSomething(Dummy &ob);
    };
    
    void DoSomething(Dummy &ob)
    {
    	Dummy o2(ob);
    	cout << "I'm here!" << endl;
    }
    
    int main(void) {
    	Dummy o1(123);
    	DoSomething(o1);
    
    	return 0;
    }
    Ovvero cambi la definizione di DoSomething da questa void DoSomething(Dummy ob); a questa void DoSomething(Dummy& ob)

    P.S: migliorabile ti ha dato una buona motivazione per cui la tua soluzione non andava. A mio avviso classi e metodi friend vanno usati solo quando strettamente necessario.
  • Re: Copy Constructor private e funzione friend

    La cosa e' abbastanza subdola, ma anche ovvia:

    il costruttore 'Dummy(Dummy&)' puo' essere utilizzate ALL'INTERNO della funzione 'DoSomething'.

    Invece TU stai tentando di utilizzarlo ALL'ESTERNO della suddetta funzione, infatti sei all'INTERNO del 'main'!

    Dove sta' l'inghippo: sta' ne; fatto che hai definito la funzione come 'void DoSomething(Dummy ob)', cioe' ob deve essere passato per VALORE e NON per REFERENCE, QUINDI il compilatore TENTA di usare il costruttore di copia per creare una COPIA di o1 da mettere sullo stack PRIMA di chiamare la funzione!

    Infatti, cosi' il compilatore compila senza problemi (che poi il programma non abbia senso, e' un'altra questione):
    
    #include <iostream>
    
    using namespace std;
    
    class Dummy {
    private:
        Dummy(Dummy &source) {}
    
    public:
        Dummy(int value) {}
    
        friend void DoSomething(Dummy ob);
    };
    
    void DoSomething(Dummy ob) {
        cout << "I'm here!" << endl;
        Dummy o2(321);
        DoSomething(o2);
    }
    
    int main(void) {
        Dummy o1(123);
        //DoSomething(o1);
        return 0;
    }
    
  • Re: Copy Constructor private e funzione friend

    Ringrazio sia "migliorabile" che "CarDeFusco" per tempestivita' e chiarezza.

    Saluti Vito Di Blas
Devi accedere o registrarti per scrivere nel forum
3 risposte