2010-11-03 5 views
1

Je reçois une erreur de compilation pour une fonction de création que j'utilise avec la fonction d'insertion. Cela fonctionne quand je fais les différents appels dans la clause if, mais je veux le déplacer à une fonction de création séparée à la place. Toute aide concernant l'erreur de compilation que j'obtiens est appréciéeC++ liste chaînée insertion fonction

| 76 | erreur: impossible de convertir list_link*' to sorted_list :: list_link * 'in assignment |

Le fichier d'en-tête

class sorted_list 
{ 
public: 
    sorted_list(); // Constructor declaration 
    ~sorted_list(); // Destructor declaration 

    void insert(int key, double value); 
    void print(); 


private: 
    class list_link 
    { 
     // Declarations 
     public: 
     my_key_type key; 
     my_value_type value; 
     list_link *next; 
    }; 
    list_link* first; 

}; 

Les fonctions

void sorted_list::insert(int key, double value) 
{ 
    list_link *curr, *prev; 

    curr = first; 

    while(curr) 
    { 
     prev = curr; 
     curr = curr->next; 
    } 
    if(first == 0 || prev == 0) //if empty or add first 
    { 
     cout << "empty list" << endl; 
     list_link *new_link = new list_link; 
     new_link->key = key; 
     new_link->value = value; 
     new_link->next = 0; 
     first = new_link; 

    } 
    else 
    { 
     cout << "add" << endl; 
     prev->next = create(key, value, 0); 
    } 
} 

créer la fonction

list_link* create(my_key_type key, my_value_type value, list_link* next) 
{ 
    // creates the node; 
    list_link *new_link = new list_link; 

    // add values to the node; 
    new_link->key = key; 
    new_link->value = value; 
    new_link->next = next; 

    return new_link; 
} 

Répondre

1

La classe list_link est:

  1. déclaré dans le cadre de sorted_list
  2. Marqué comme private

Afin d'avoir une fonction autoportant créer un objet de ce type, vous devez faire le public de type, et vous aurez également besoin de préfixer avec sorted_list::, ou vous devrez le déclarer en dehors de la classe sorted_list. Je devrais ajouter que vous utilisez list_link comme un objet de données simple, où il n'y a pas de méthodes et les champs sont publics, et donc - d'un point de vue purement stylistique - je recommande de le déclarer comme struct au lieu d'une classe, qui supprime le besoin de public.

+0

est il y a une autre manière, puisque je veux garder la création de nœud interne à la classe seulement – starcorn

+2

@starcorn, si elle est interne, alors n'utilisez pas une fonction autonome; rend la fonction create une fonction privée de tried_list. –

+0

ah, c'est ce que je pensais mais j'ai continué à me débattre pendant un certain temps avant de voir que je devais écrire sorted_list :: list_link sorted_list :: create() {} dans le fichier .cc. De toute façon je pense que je l'ai réglé maintenant. Merci – starcorn

0

Je ne suis pas une autorité en C++ mais je pense que le problème vient de la façon dont vous faites des choses.

  1. La classe list_link est privée. Je recommande que cela soit public car une classe n'est qu'un plan à travers lequel les instances d'objet peuvent être créées. Ce que vous pouvez garder privé est le pointeur réel à la liste liée, list_link *first.

  2. Depuis la classe list_link est imbriqué sous la classe sorted_list, vous devez passer par le champ sorted_list chaque fois que vous essayez d'accéder à la classe list_link.

Try this out pour une solution:

class sorted_list 
{ 
public: 
    sorted_list(); // Constructor declaration 
    ~sorted_list(); // Destructor declaration 

    void insert(int key, double value); 
    void print(); 


    class list_link 
    { 
     // Declarations 
     public: 
     my_key_type key; 
     my_value_type value; 
     list_link *next; 
    }; 
private: 
    list_link* first; 

}; 

sorted_list::list_link* create(my_key_type key, my_value_type value, sorted_list::list_link* next) 
{ 
    // creates the node; 
    sorted_list::list_link *new_link = new sorted_list::list_link; 

    // add values to the node; 
    new_link->key = key; 
    new_link->value = value; 
    new_link->next = next; 

    return new_link; 
} 

void sorted_list::insert(int key, double value) 
{ 
    list_link *curr, *prev; 

    curr = first; 

    while(curr) 
    { 
     prev = curr; 
     curr = curr->next; 
    } 
    if(first == 0 || prev == 0) //if empty or add first 
    { 
     cout << "empty list" << endl; 
     list_link *new_link = new list_link; 
     new_link->key = key; 
     new_link->value = value; 
     new_link->next = 0; 
     first = new_link; 

    } 
    else 
    { 
     cout << "add" << endl; 
     prev->next = create(key, value, 0); 
    } 
} 

Hope this helps. À la vôtre.