2010-11-12 6 views
-1

Quelqu'un pourrait-il expliquer le code ci-dessous?Comprendre les pointeurs et les références en C++

A{} 

C{public: begin(&a); private: A *a;} 

begin(&a) 
{ 
    a = &a; 
} 

B{private: A *a; C *c; start(); } 

start(){ 
    c->begin(&a); 
} 

=> En B, l'objet A est créé et C l'objet A est référencée à l'un objet dans B.

je suis arrivé à ce problème:

no matching function for call to: begin(a**), candidate: begin(&a)

Dans le cas contraire , je peux écrire cela en C# et je ne suis pas sûr de savoir comment mettre en œuvre ce en C++:

public class A 
{ 
    public A(){} 
} 

public class B 
{ 
    A a; 
    C c; 
    public B() 
    { 
     c = new C(); 
    } 

    void start() 
    { 
     a = new A(); 
     c.begin(a); 
    } 
} 

public class C 
{ 
    A a; 
    public C(){} 

    public void begin(A a) 
    { 
     this.a = a; 
    } 
} 
+15

S'il vous plaît signaler * vrai * code, c'est confus. –

+1

Je suis plus de la moitié tenté d'enlever la balise C++. –

+0

Le message d'erreur ressemble à un message d'erreur craché par un compilateur C++. Évidemment, la syntaxe est bien loin. –

Répondre

2

Essayez-vous simplement d'obtenir la syntaxe correcte?

class A 
{}; 

class B 
{ 
    std::auto_ptr<A> a; // This object owns A so use a smart pointer to indicate ownership. 
    C    c; 

    B(B const&);   // Disable copying. If you want copying use boost::shared_ptr 
    B& operator=(B const&);// Disable copying. 

    public: 
    void start() 
    { 
     a.reset(new A()); 
     c.begin(a.get()); 
    } 
}; 

class C 
{ 
    A* a; 
    public: 
     C() 
     : a(NULL) 
     {} 

    void begin(A* pA) 
    { 
     a = pA; 
    } 
}; 
+0

J'espère que votre exemple n'était pas une tentative pour le réparer. –

+0

Juste une tentative pour déchiffrer ce qui précède. L'OP comprend évidemment les concepts de OO (à un niveau de base) mais n'a aucune compréhension de la syntaxe C++. –

+0

Salut, merci pour votre reformatage. Mais je voudrais passer la référence en appelant les méthodes au lieu de construire la classe. – olidev

1

Vous passez l'adresse d'un et recevoir l'objet par référence ... ce n'est pas ce que vous voulez. Vous voulez passer l'objet réel, mais le recevoir par référence. Si a est un pointeur, alors vous passez l'adresse du pointeur (d'où le **). Déréférencer et passer l'objet réel

+0

mais alors j'ai eu ce problème: erreur: attendu ';' avant ')' token :( – olidev

1

Le compilateur se plaint du type de l'objet que vous passez à la fonction C :: begin(). Pour autant que je puisse voir, vous déclarez votre fonction comme une fonction en prenant comme référence une référence. L'appel doit donc être c->begin(*a) et non c->begin(&a).

+0

Oui, il ne s'en plaint pas: attendu ';' avant ')' – olidev

+0

S'il y a une erreur de syntaxe, vous devriez publier votre code entier pour que nous puissions voir quel est le problème. –

0

Vous vous méprenez sur le fonctionnement des références C++. Si vous voulez passer une référence à une méthode, vous n'avez rien à faire sur le site d'appel. Il n'est pas nécessaire d'utiliser l'adresse de l'opérateur (&) comme s'il y avait un pointeur. Voir, par exemple, ce simple programme C++ qui utilise des références:

#include <iostream> 

void test (int& a) { 
    a = 7; 
} 

int main (int argc, char** argv) { 
    int q; 
    test (q); 
    std::cout << q << std::endl; 
} 

La référence est passée sans décorations spéciales. Si vous souhaitez attribuer à un pointeur, vous avez besoin d'utiliser l'adresse de l'opérateur pour obtenir un pointeur d'une référence, comme ceci:

#include <iostream> 

int* ptr; 

void test (int& a) { 
    a = 7; 
    ptr = &a; 
} 

int main (int argc, char** argv) { 
    int q; 
    test (q); 
    std::cout << q << std::endl; 
    std::cout << *ptr << std::endl; 
} 

Dans votre exemple, la définition de begin (&a) est correcte, mais son Appelez le site au start est incorrect, et devrait être écrit comme c->begin (*a) (vous ne pouvez pas passer un pointeur vers une méthode qui attend une référence, donc vous devez déréférencer un premier).

+0

Salut, Merci. C'est clair mais ensuite j'ai eu ce problème: erreur: attendu ';' avant ')' jeton :( – olidev

Questions connexes