2010-10-03 7 views
2

J'ai une logique dans le constructeur de la classe de base. Le résultat de la logique doit être capturé dans le constructeur de la classe dérivée dans une variable temporaire. Y a-t-il un moyen de le faire?Référence C++ dans le constructeur de la classe de base

Par exemple

class Base 
{ 
    Base() { int temp_value = some_logic; } 
}; 

class Derived : public Base 
{ 
    Derived() { // need the temp value here.. } 
}; 

Merci, Gokul.

+1

Avez-vous envisagé de faire de 'temp_value' un membre protégé de la classe afin qu'il soit accessible au constructeur de la classe dérivée? –

+0

@Richard :: L'ajout d'une variable membre n'est pas une option, car cela augmentera la taille de l'objet. Au lieu de cela, nous pouvons choisir de recalculer la valeur – Gokul

Répondre

2

Je pense que la meilleure façon que je peux penser serait juste some_logic séparée dans sa propre méthode ...

class Base 
{ 
    Base() { int temp_value = initializationLogic(); } 
    int initializationLogic(){ return some-logic;} 
}; 

class Derived : public Base 
{ 
    Derived() { int temp_value_here_too = initializationLogic(); } 
}; 
+0

Le résultat serait que l'initializationLogic() est appelée deux fois. – ChrisW

+0

Merci pour la réponse. Eh bien, je ne demandais pas l'organisation du code, si je suis mal compris. Je demandais un moyen d'éviter le double calcul. – Gokul

+1

Mais vous avez * rejeté * la façon d'éviter le double calcul lorsque vous avez dit que vous ne vouliez pas ajouter un champ à la classe. Stocker la valeur * est * le moyen d'éviter le double calcul. –

2

Soit:

class Base 
{ 
    protected int not_so_temp_value; 
    Base() { not_so_temp_value = some_logic_result; } 
}; 

class Derived : public Base 
{ 
    Derived() { // read the not_so_temp_value member here.. } 
}; 

Ou:

class Base 
{ 
    Base(int some_logic_result) { int temp_value = some_logic; } 
}; 

class Derived : public Base 
{ 
    static Derived* create() 
    { 
     int some_logic_result = some_logic; 
     return new Derived(some_logic_result); 
    } 
    Derived(int some_logic_result) : Base(some_logic_result) 
    { // use the some_logic_result here.. } 
}; 
+0

!! Merci pour les réponses. Le premier augmente la taille. La deuxième demande de changer le constructeur. Oh oui!!! Je peux faire l'extra en tant que paramètre par défaut. Merci..... – Gokul

0

Ceci est celui que je prévois d'utiliser

class Base 
{ 
    Base(int& some_logic_result) { some_logic_result = some_logic; } 
}; 

class Derived : public Base 
{ 
    Derived(int some_logic_result = 0) : Base(some_logic_result) 
    { // use the some_logic_result here.. } 
}; 

Merci, Gokul.

Questions connexes