2011-01-31 28 views
6

Tengamos un objeto A de C++. Hay dos variables (VAR1 y VAR2) en A accesibles para sus hijos. El objeto B amplía A y tiene una variable privada VAR3 y también puede acceder a VAR1 y VAR2. Cada instancia de A/B tiene sus propias variables.Variables C++: declarar y definir. Herencia

¿Sería esta la forma correcta de declarar y definir las variables?

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

¿Qué errores tienes? – Falmarri

+0

es esta tarea? – nairdaen

Respuesta

4

Cada instancia de A/B tiene sus propias variables.

¿Sería esta la forma correcta de declarar y definir las variables?

No. Ha declarado A miembros como lo que significa que son variables de clase, no variables de instancia. Cada instancia no obtiene su propia copia. En cambio, todos comparten la misma instancia.

Make entonces no static:

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

... y luego, por supuesto, no es necesario el inicializador global, de manera de deshacerse de este:

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

...y si quieres VAR1 tener un valor por defecto cada vez que se crea una instancia A, a continuación, puede hacer que en la lista de inicialización de clase (o en el cuerpo de Héctor, si eres un punk :)):

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

@downvoter: explique para que esta publicación se pueda mejorar –

+0

@downvoter: si no le gustaba que lo llamaran punk, solo estaba siendo gracioso :) –

+0

Hola y gracias. Me confundí un poco después de leer sobre variables externas vs estáticas ... Así que, para resumir. Hago todas las declaraciones no estáticas, elimino todas las definiciones y asigno valores en los constructores. ¿Derecha? – Petr

1

Cada instancia de A/B tiene sus propias variables.

No es así. Usted los ha declarado static. Deje de hacer eso y puede estar más cerca de su resultado deseado.

1

No, lo entendiste mal.

  • El problema requiere que cada instancia para tener su propio conjunto de variables, por qué estás declarando A y datos B 's como static?
  • No necesita implementar nada. El problema simplemente le pide que declare los tipos y sus datos de miembro.
  • El constructor tampoco es necesario en cuanto a lo que los requisitos le piden.
0
class A{ 
protected: 
    char var1,var2; 
}; 

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

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