2009-09-14 9 views
55

Imagínese que tengo una clase de C++ y una barra de Foo clase que tiene que ser creado con un constructor en el que se pasa un puntero Foo, y este puntero tiene la intención de permanecer inmutable en la instancia del ciclo de vida bar. ¿Cuál es la forma correcta de hacerlo?¿Cómo inicializar un campo const en el constructor?

De hecho, pensé que podría escribir como el código de abajo pero no compila ..

class Foo; 

class Bar { 
public: 
    Foo * const foo; 
    Bar(Foo* foo) { 
     this->foo = foo; 
    } 
}; 

class Foo { 
public: 
    int a; 
}; 

Cualquier sugerencia es bienvenida.

Respuesta

64

que tiene que hacer en una lista de inicialización:

Bar(Foo* _foo) : foo(_foo) { 
} 

(Tenga en cuenta que Retitulé la variable de entrada para evitar confusiones.)

+3

+1, aunque recientemente he aprendido aquí que las variables comenzando con guión bajo ahora * oficialmente * reservado ;-) –

+1

Solo si están seguidos de una letra mayúscula. – GManNickG

+1

o están en el alcance del espacio de nombres! O son seguidos por otro guion bajo. Así que sí, es técnicamente legal en este caso, pero diría que es más fácil fingir que son reservados y no usarlos en absoluto. :) – jalf

2

utilizar una referencia:

Foo& foo; 
Bar(Foo& f) : foo(f) { } 

Usted a continuación, se puede referir a foo fácilmente en Bar:

foo.doSomething(); 
+1

Yo voto como "negativo" porque si fuera la única respuesta, podría haber pensado erróneamente que el uso de una referencia era la única forma de lograrlo, mientras en cambio, como muestra la otra respuesta, el truco es la lista de inicializadores. – puccio

+0

En mi humilde opinión, las referencias son mucho más elegantes en este caso porque el puntero no debe ser cambiado en absoluto después de que se inicializa :) – AraK

+1

Pero la pregunta era cómo inicializar el puntero. –

0

intento: Bar(Foo* xfoo) : foo(xfoo) {}

12

Inicialización miembros const y otros casos especiales (A Clases de tales matrices) se puede lograr en la lista de inicialización

class Foo { 
private: 
    const int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

O, del mismo modo, para la inicialización de los padres

class Foo { 
private: 
    int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

class Bar : Foo { 
public: 
    Bar(int x) : Foo(x) {} 
}; 
5

Necesita inicializar foo en la lista de inicializadores.

class Bar { 
    Foo* const foo; 
    public: 
    Bar(Foo* f) : foo(f) {...} 
}; 
16

Creo que debe hacerlo en un inicializador. Por ejemplo:

Bar(Foo* foo) : foo(foo) { 
} 

Como nota al margen, si nunca va a cambiar lo que foo puntos en, pasarlo en como referencia:

Foo& foo; 

Bar(Foo& foo) : foo(foo) { 
} 
+2

+1: use referencias donde lo desee, punteros donde lo necesite. –

Cuestiones relacionadas