2011-01-31 9 views
6

Abbiamo un oggetto C++ A. Ci sono due variabili (VAR1 e VAR2) in A accessibili ai suoi figli. L'oggetto B estende A e ha una variabile privata VAR3 che può anche accedere a VAR1 e VAR2. Ogni istanza di A/B ha le sue variabili.Variabili C++: dichiarare e definire. Eredità

Questo sarebbe il modo giusto di dichiarare e definire le variabili?

A.h


class A { 
protected: 
    static std::string const VAR1; 
    static std::string VAR2; 
}; 

A.cpp


#include "A.h" 
using namespace std; 
string const A::VAR1 = "blah"; 
string A::VAR2; 

B.h


#include "A.h" 
class B : public A { 
private: 
    static std::string VAR3; 

public: 
    B(std::string const v1, std::string const v2); 
    void m() const; 
}; 

B.cpp


#include "B.h" 
using namespace std; 

string B::VAR3; 

B::B(string const v1, string const v2) { 
    VAR2 = v1; 
    VAR3 = v2; 
} 

void B::m() const { 
    // Print VAR1, VAR2 and VAR3. 
} 
+1

Che errori stai avendo? – Falmarri

+0

è questo compito? – nairdaen

risposta

4

Ogni istanza di A/B ha le proprie variabili.

Questo sarebbe il modo giusto di dichiarare e definire le variabili?

No. Hai dichiarato A s' come membri static che significa che sono variabili di classe, non di istanza-variabili. Ogni istanza non ottiene la propria copia. Invece, condividono tutti la stessa istanza.

Fare quindi non static:

class A { 
protected: 
    std::string const VAR1; 
    std::string VAR2; 
}; 

... e poi, naturalmente, non è necessario l'inizializzazione globale in modo sbarazzarsi di questo:

string const A::VAR1 = "blah"; 
string A::VAR2; 

...e se si vuole VAR1 ad avere un valore predefinito ogni volta che viene creata un'istanza A, allora si può fare che nella lista di inizializzazione della classe (o nel corpo ctor, se sei un punk :)):

A::A() : VAR1("blah") {}; 
+0

@downvoter: per favore spiega in modo che questo post possa essere migliorato –

+0

@downvoter: se non ti piaceva essere chiamato un punk, stavo solo facendo la faccina :) –

+0

Ciao e grazie. Mi sono un po 'confuso dopo aver letto delle variabili statiche rispetto a extern ... Quindi, per riassumere. Rendo tutte le dichiarazioni non statiche, rimuovi tutte le definizioni e assegna valori nei costruttori. Destra? – Petr

1

Ogni istanza di A/B ha le proprie variabili.

Non così. Li hai dichiarati static. Smetti di farlo e potresti avvicinarti al risultato desiderato.

1

No, hai sbagliato.

  • Il problema richiede ogni istanza di avere il proprio insieme di variabili, allora perché stai dichiarando A e dati s' B come static?
  • Non è necessario implementare nulla. Il problema ti chiede semplicemente di dichiarare i tipi e i loro dati dei membri.
  • Il costruttore non è necessario per quanto riguarda i requisiti richiesti.
0
class A{ 
protected: 
    char var1,var2; 
}; 

class B: public A { 
private: 
    char var3; 
}; 

void main() 
{ 
    B b1; 
    b1.var3='a'; 
}