2010-10-11 12 views
13

Ho una classe C++ astratta senza costruttore. Dovrebbe essere una classe base in modo che altre classi possano ereditarla. Quello che sto cercando di fare è dichiarare una variabile costante nella classe base e inizializzarla in ogni costruttore di classe derivata, ma in nessun'altra parte in ciascuna di queste classi. È legale in C++? Se è così, come posso farlo?Come posso inizializzare una variabile const di una classe base in un costruttore di classi derivate in C++?

risposta

19

È legale in C++?

No. La costante mosto essere inizializzato nel costruttore della classe base.

La soluzione è fornire un costruttore appropriato nella classe base, altrimenti non può essere utilizzato. Inoltre, non c'è motivo per non fornire quel costruttore.

class Base { 
    int const constant; 
public: 
    virtual ~Base() = 0; // Makes this an abstract base class. 
protected: 
    Base(int c) : constant(c) { } 
}; 

// Must be implemented! 
Base::~Base() { } 

class Derived : public Base { 
public: 
    Derived() : Base(42) { } 
}; 
+0

Se si rende 'protetto il costruttore di classi base ', non ci si deve preoccupare di nessun altro che lo instanzia direttamente. – Zooba

+0

Ho pensato che se c'è un costruttore in una classe base astratta, non è più astratto perché può essere istanziato. Ho sbagliato? – user246392

+0

@Zooba: corretto. Vedi il mio codice aggiornato. ;-) Inoltre, ci sono altri modi per rendere un abstract di classe base (vale a dire irrinunciabile). Il modo standard è di fornire una funzione virtuale pura (ad esempio, convenientemente il distruttore, che ** deve ** essere virtuale in ogni caso). –

0

Perché non fate un costruttore protetto nella classe base astratta e impostare il valore costante lì?

1

Se a tutto quello che dovete fare in questo modo:

struct Base { 
    Base(std::string const & someValue) 
    : const_value(someValue) { 
    } 
protected: 
    std::string const const_value; 
}; 

struct Derived : Base { 
    Derived() 
    : Base("Derived"){ 
    } 
}; 

La ragione di questo è che è consentito solo per assegnare valori a un valore const in fase di inizializzazione. Una volta inizializzata la Base, non è più possibile modificare il valore. Quindi devi farlo in questo modo come mostrato sopra.

Problemi correlati