2011-11-19 3 views

Respuesta

8

Sí.

Es posible que desee deshacerse de la dependencia orden de inicialización, y escribir:

C(int _var): var(_var), i(_var*_var) 

Básicamente, haciendo que dependo de var, debe asegurarse de que se declara var antes de la clase.

Del mismo modo, puede inicializar algo en C que se define (e inicializado) en una clase padre, porque el padre se construirá antes de C.

mejores prácticas dictan que esté al tanto de lo anterior, y evitar situaciones que ofuscan algo de eso; tal vez documente su dependencia de var, para que el próximo programador (tal vez usted mismo) no presente un problema de orden de inicialización.

+1

Quiero enfatizar su segunda oración: 'var' debe declararse antes de' i' en la clase _definition_. No en la lista de inicializadores (lo cual no importa). –

5

Ese código tiene significado definido, suponiendo que la multiplicación no se desborde.

Tenga en cuenta que se basa críticamente en el hecho de que var está definido antes de i en la clase (el orden en la lista de inicializadores es irrelevante, lo único que importa es el orden en que los miembros están definidos). De lo contrario, i se inicializaría utilizando el unitializado miembro de datos var.

Pero si obtiene un comportamiento errático con exactamente ese código, entonces el error está en otra parte.

5

Sí, esto es seguro, pero en este caso debe tener cuidado. Está utilizando var y no _var, por lo que debe asegurarse de que var esté construido antes de i. Este es el caso aquí, ya que los miembros se construyen en el orden de su declaración (en este caso var, i), que pueden ser diferentes del orden de su aparición en la lista de inicializadores.

Entonces, en este caso, funciona. También funciona en este caso:

C(int _var): i(var*var), var(_var) 

pero no en esto:

class C{ 
    public: 
     C(int _var): var(_var), i(var*var) 
     {} 
    private: 
     int i; 
     int var; 
}; 

Pero, por supuesto, para estar siempre en el lado seguro, es posible que utilices _var:

C(int _var): var(_var), i(_var*_var) 
+0

¡Eso funcionó! Entonces, ¿el orden de inicialización en un ctor depende del orden de declaración de las variables en el prototipo de clase? ¡Eso tiene sentido! – user965369

+1

@ user965369 Ese es el motivo por el que también debe enumerarlos en este orden en la lista de inicializadores (lo que hizo), para evitar confusiones. –

+0

@ user965369: Debes activar las advertencias del compilador (-Wall en gcc, \ W3 en VC++), advirtiendo que una lista de inicializadores ordenada incorrectamente es común y te ayudará a realizar esos errores antes. –

Cuestiones relacionadas