2016-10-04 1 views
0

Par exemple:Accès aux membres de structure à l'intérieur d'une classe de membres privés?

graph.h

#ifndef GRAPH_H 
#define GRAPH_H 

#include <iostream> 
#include <string> 

using namespace std; 

class graph 
{ 
private: 
    struct node 
    { 
     string name; 
     int currentValue; 
     struct node *next; 
    }; 
    node* head; 
public: 
    graph(); 
    ~graph(); 

    graph(string* newName, int* givenValue); 
} 

#endif 

graph.cpp

#include "graph.h" 

graph::graph() {} 

graph::~graph() {} 

graph::graph(string* newName, int* givenValue) 
{ 
    //This is what I want to achieve 
    this->node->name = newName;     //Compile error 
} 

main.cpp

#include "graph.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    return 0; //Note I have not yet created a graph in main 
} 

Comment puis-je accéder au membres de la structure pour la fonction ci-dessus?

C'est l'erreur:

graph.cpp: In constructor ‘graph::graph(std::string*, double*)’: 
graph.cpp:24:8: error: invalid use of ‘struct graph::node’ 
this->node->label = newName; 
+0

Ce que vous voulez faire est: 'this-> head-> label = newName;'; 'node' est un type, pas un membre. Quoi qu'il en soit, je vous suggère de ne pas utiliser un pointeur, c'est-à-dire: define 'node head;' au lieu de 'node * head; ', alors utilisez' this-> head.label = newName; ' – shrike

+0

nitpicking aide parfois: Vous n'avez pas accès le membre d'une structure/classe, mais le membre d'une instance d'une structure/classe – user463035818

+0

quel genre de graphique bizarre c'est, mec? Êtes-vous sûr de ne pas vouloir dire arbre? – v78

Répondre

1

Le problème n'a rien à voir avec votre struct privé. Le constructeur devrait pouvoir accéder à tous les membres privés.

Le problème que vous confondre le nom de struct node et le nom de la variable head:

this->node->name = newName; // incorrect

Au lieu de cela, vous devriez écrire:

this->head->name = *newName; 
1

Si vous souhaitez accéder à la variable de classe vous devez appeler

this->head->name = *newName; 

mais vous pouvez n omettent this-> si ce qui suit est bien

head->name = *newName; 

Couple d'autres notes:

  • string* newName est un pointeur si vous avez besoin d'accéder à sa valeur avec l'opérateur de déréférencement « * » (à savoir head->name = *newName; au lieu de head->name = newName;
  • node* head est un pointeur et actuellement vous essayez d'accéder à un pointeur non initialisé. Vous avez probablement besoin de quelque chose comme head = new node();.
0

Votre problème n'est pas lié à l'accès privé. Tout d'abord, ajouter ; mettre fin à votre déclaration de classe:

class graph 
{ 
    // ... 
}; 

Ensuite, vous avez saisi this->node->name en node est un type. Changez cette ligne pour this->head->name. Notez que le pointeur head n'est pas initialisé ici.

Et puis, newName est de type string* tandis que this->head->name est de type string.Selon la façon dont vous voulez utiliser votre classe, vous pouvez envisager de modifier votre code comme ceci:

graph::graph(const string& newName, int givenValue): 
    head(new node) 
{ 
    //This is what I want to achieve 
    this->head->name = newName; 
} 

Ou comme ceci:

graph::graph(string* newName, int* givenValue): 
    head(new node) 
{ 
    //This is what I want to achieve 
    this->head->name = *newName; 
} 

Aussi, lisez rule of 3/5/0.