2013-05-27 3 views
1

Ok donc j'ai deux classes qui ressemblent:paramètre Modifier const référence

class Item 
{ 
    private: 
     HANDLE Parent; 

    public: 
     Item(const Item &I) = delete; 
     Item(Item &&I) = delete; 
     void SetParent(HANDLE Handle); 

     Item& operator = (const Item &I) = delete; 
     Item& operator = (Item &&I); 
}; 

void Item::SetParent(HANDLE Handle) 
{ 
    this->Parent = Handle; 
} 

Item& Item::operator = (Item&& I) {/*Do Move Here*/} 


class Box 
{ 
    private: 
     HANDLE Handle; 

    public: 
     void Add(const Item &I); 
}; 

void Box::Add(const Item &I) 
{ 
    I.SetParent(this->Handle); //Error.. Item I is const. 
} 

Je reçois l'erreur que j'est const et qui a du sens, mais je besoin d'un moyen de SetParent de l'article I sans perdre la capacité I construire en place afin:

Box B(Item()); 

au lieu de:

Item I; 
Box B(I); 

Toute idée comment je peux garder construc en ligne tion de I tout en étant capable de le modifier en appelant SetParent?

+2

Références Rvalues. – Xeo

+0

Est-ce que cela signifie que je devrais créer deux fonctions? Un qui prend seulement une référence (non-const) et un qui prend RValue Reference pour que je ne perds pas la construction Non-Inline? – Brandon

+1

Oui, il faut deux constructeurs - ou un seul, si vous pouvez en faire un template (lire sur "Universal reference" s). – Xeo

Répondre

2

Une solution consiste à déclarer le membre Parent comme mutable et de rendre la méthode SetParent constante. Un exemple de code est disponible et disponible online

typedef int HANDLE; 

class Item 
{ 
    private: 
     mutable HANDLE Parent; 

    public: 
     Item(const Item &I) = delete; 
     Item(Item &&I) = delete; 
     void SetParent(HANDLE Handle) const; 

     Item& operator = (const Item &I) = delete; 
     Item& operator = (Item &&I); 
}; 

void Item::SetParent(HANDLE Handle) const 
{ 
    this->Parent = Handle; 
} 

class Box 
{ 
    private: 
     HANDLE Handle; 

    public: 
     void Add(const Item &I); 
    public: 
     Box(const Item &I) { 
      Add(I); 
     } 
}; 

void Box::Add(const Item &I) 
{ 
    I.SetParent(this->Handle); //Error.. Item I is const. 
} 

int main(void) { 
    return 0; 
} 
+1

'mutable' ne devrait être utilisé que pour l'état invisible - avoir ou ne pas avoir un parent ne passe pas comme" état invisible ", au moins pour moi. – Xeo

+0

Hmm Je n'ai jamais vu ce mot-clé mutable auparavant. Peut-être pour une bonne raison, peut-être pour le mal. Cela semble vraiment cool. J'ai fini par utiliser la référence R-Value comme mentionné précédemment. Je vais accepter cela car cela a piqué mon intérêt et c'est la seule réponse en ce moment. – Brandon

Questions connexes