2009-09-29 9 views
0

J'ai cette classe qui a un modèle double liste d'une struct de deux caractères et un autre structLes structures en C++ peuvent être modifiées? ou il y a une restriction?

typedef struct KeyC{ 
    char K[5]; 
    char C[9]; 
} TKeyC; 

typedef struct Bin{ 
    char Car; 
    char Cad[9]; 
    TKeyC *KC; 
} TBin; 

class Bo { 
    private: 
     TDoubleList<TBin> *Ent; 

    public: 
      ... 
} 

J'ai une méthode pour créer des noeuds. Pas de problème avec ça, mais quand j'appelle une autre méthode pour modifier la direction du pointeur vers une nouvelle structure TKeyC cela ne se produit tout simplement pas.

TNode<TBin> *Aux; 
TKeyC *AuxKC=new TKeyC; 
Aux->getObj().KC=AuxKC; 

Dois-je utiliser une classe au lieu d'une struct dans ce cas, ou est un problème de struct, ou il y a un bogue?

Mise à jour

template <class T> 
class TNode 
{ 
    private: 
     T TObj; 
     TNode<T> *Prev,*Next; 

    public: 
     TNode(); 
     ~TNode(); 
     TNode(T); 
     void setObj(T); 
     void sPrev(TNode<T>*); 
     void sNext(TNode<T>*); 
     T getObj(); 
     TNode<T>* gPrev(); 
      TNode<T>* gNext(); 
}; 

Et la méthode getObj:

template <class T> 
T TNode<T>::getObj() {return(TObj);}; 
+3

Quelle est la déclaration de 'getObj()'? Vous avez donné peu d'informations précieuses sur ce que vous faites réellement ici; à la place, vous avez donné des informations sur ce que vous * pensez * du problème, qui est probablement sans rapport. Veuillez publier un exemple simple, complet et exécutable qui illustre votre problème. –

+0

Quel type est 'Aux' et que retourne' getObj'. –

+0

Merci pour la mise à jour. Comme je le soupçonnais, votre fonction 'getObj()' renvoie une * copie * de l'objet. J'ai mis à jour la réponse de David Crawshaw qui décrit le problème plus en détail. –

Répondre

6

Une structure en C++ est une classe dont les membres sont tous publics. Si votre mission ne change pas la valeur que vous voulez, vous n'attribuez pas ce que vous pensez être.

La fonction getObj() renvoie une copie de la structure, et non une référence à l'original. Donc, vous mettez à jour la valeur dans la copie, et l'original reste inchangé. Obtenez une référence à votre objet, soit en changeant le type de retour de getObj() à T& ou en ajoutant une autre fonction si vous avez un autre code qui dépend du comportement.

+1

Je pense que c'est exactement ça. Changez le type de retour de getObj de T à T &. – Darryl

0

Pourquoi utiliser le mot-clé typedef lorsque vous déclarez une structure?

+1

Les vieilles habitudes de codage «C» meurent difficilement, je suppose. –

+0

Oui, je le pense – msantamaria

+0

C'est vrai, ne peut pas contrôler mes habitudes. Ce serait mieux? struct {...} TKeyC; – Nek

0

Est-ce que cela fonctionne pour vous?

TBin x = Aux->getObj(); 
x.KC=AuxKC; 

Si getObj() renvoie un pointeur vers l'objet, utilisez x->KC=AuxKC

Questions connexes