2013-05-28 3 views
0

Dans C++ cela fonctionne avec des pointeurspointeur vs référence en C++

#include <iostream> 

using namespace std; 

struct Base { 
    virtual void base_method() { 
     cout << "this is the base\n"; 
    } 
}; 

struct Derived : public Base { 
    void base_method() { 
     cout << "this is the child\n"; 
    } 
}; 

void test(Base & b) { 
    b.base_method(); 
} 

void test2(Base * b) { 
    b->base_method(); 
} 

int main() { 
    Derived * d; 
    Derived & d1(); 
    test2(d); //this works 
    test(d1); //this doesn't 
    return 0; 
} 

Pourquoi est-ce que vous ne pouvez pas faire la même chose avec une référence comme Child & c() passé dans la fonction de test. Je demande cela puisque les pointeurs et les références ont tendance à se comporter de manière similaire

+2

Quelle est "la même chose" ? –

+0

@ H2CO3 Si vous passez la référence à la fonction de test, il ne compilera pas – aaronman

+0

@aaronman Euh, * pourquoi * pensez-vous qu'il compilera? Les références ne sont pas des pointeurs ... –

Répondre

5

C'est parce que votre exemple est mal choisi. Vous ne devriez généralement pas avoir le code utilisateur flottant new nu.

L'exemple suivant montre les similitudes:

struct Base { virtual ~Base() {} }; 
struct Derived : Base { }; 

void foo(Base *); 

void bar(Base &); 

int main() 
{ 
    Derived x; 
    foo(&x); // fine 
    bar(x); // fine and even better 
} 

(Notez également qu'une relation parent-enfant est très différent d'une relation dérivée de base Ce dernier est un « est-un » un, l'ancien. est un « supporte labour-25 » une.)

+3

"soutient-jusqu'à-25"? C'est pire que je pensais. –

+0

Je ne pense pas que cela compile – aaronman

+0

je ne suis pas stupide mais quelle est la relation parent-enfant ici? Je suis seulement habitué à base dérivée.désolé si c'est bête mais je ne pouvais pas résister –

3
Derived & d() 

est une déclaration de fonction (type de retour dérivée & et ne comportant pas le paramètre d'entrée) et ne instanciation d'objets. C'est MVP de C++ (http://en.wikipedia.org/wiki/Most_vexing_parse)

utiliser cette syntaxe

Derived d; 

et

appel comme si

test(d); 
+0

Pas réellement l'analyse * la plus vexante, mais vexant tout de même. –

3

Derived & d1(); ne fait pas ce que vous avez pris.

Jetez un oeil here:

[10.2] Est-ce qu'il ya une différence entre la liste x; et Liste x() ;? Une grosse différence! Supposons que List soit le nom d'une classe.

Ensuite, la fonction f() déclare un objet Liste local appelé x:

void f() 
{ 
    List x;  // Local object named x (of class List) 
    ... 
} 

Mais g() fonction déclare une fonction appelée x() qui retourne une liste:

void g() 
{ 
    List x(); // Function named x (that returns a List) 
    ... 
} 
Questions connexes