2009-02-17 12 views
5

Mam klasa C++, powiedzmy, że to się nazywa c, i chcę używać niejawny kopiowania konstruktor w jednej z metod, takich jak to:Używanie „to” jako parametr skopiować konstruktora

c c::do_something() { 
    c copy = this; //I want implicit copy constructor here! 
    copy.something_else(); 
    //........// 
    return copy; 
} 

jednak gcc powraca ten błąd:

error: invalid conversion from 'c* const' to 'long unsigned int'

(mam innego konstruktora od dawna obecny unsigned int)

... jakby konstruktor kopia nie istnieje. Co ja robię źle?

Odpowiedz

20

to jest wskaźnik do obiektu tak powinno być

c copy = *this; 
+0

ok ... tak, najwyraźniej tak. dzięki :) –

+0

To naprawdę używa domyślnego konstruktora, a następnie operatora przypisania, * nie * konstruktora kopiowania. Zobacz odpowiedź Matta. –

+0

Andrew: Nie jestem pewien - Josh poniżej (i niektóre strony) mówi odwrotnie: –

4

Whoa whoa! Nie należy mylić konstruktora kopiowania i operatora przypisania kopiowania.

c copy (*this); 

jest konstruktorem kopii;

c copy = *this; 

jest operatorem przypisania kopii. Albo zadziała, chociaż konstruktor kopii jest technicznie bardziej wydajny, chociaż operator przypisania kopii jest często zoptymalizowany pod kątem tego samego.


Wow - mnie poprawiono. Używanie operatora = w tej samej instrukcji co deklaracja zmiennej rzeczywiście wywołuje konstruktora kopiowania. Każdego dnia uczysz się czegoś nowego!

+0

No - c copy (* this); jest identyczny z c copy = * this; (pod warunkiem, że * jest to typ c), oba wywołują konstruktora kopiowania. c kopia; copy = * this; wywołuje domyślny konstruktor, a następnie operator przypisania. – Eclipse

+0

To nie tylko kwestia wydajności ... Konstruktor kopiowania i operator przypisania mogą być zupełnie innymi funkcjami. –

6

Całkiem na bok, ale nie zmieści się w komentarzu i wydaje się, że jest jakaś różnica zdań. Wypróbuj ten fragment kodu, aby dowiedzieć się, kiedy zostaną nazwani konstruktorzy kopii i operatorzy przypisania:

class A 
{ 
public: 
    A() { cout << "A::A()\n"; } 
    A(const A &) { cout << "A::A(const A &)\n"; } 
    void operator =(const A &) { cout << "A::operator=(const A &)\n"; } 
}; 

int main() 
{ 
    A a; // default constructor 
    A copy = a; // copy constructor (and no assignment operator) 
    A copy2(a); // copy constructor (and no assignment operator) 
    a = copy; // assignment operator 
    A function(); // declares a function return A 
    A b = A(); // default constructor (but no assignment operator) 
    A b2 = A(a); // copy constructor (but no assignment operator) 
} 
+0

Dla kompletności może być pomysłem dodanie konstruktora "A (int)", a następnie pokazanie, że "A a = 10;" jest równoważne: "A a (A (10))". –