2010-01-11 22 views
16

bool "bar" es cierto por defecto, pero debe ser falso, no puede iniciarse en el constructor. ¿Hay alguna manera de iniciarlo como falso sin hacerlo estático?¿Por qué un C++ bool var es verdadero por defecto?

versión simplificada del código:

foo.h

class Foo{ 
public: 
    void Foo(); 
private: 
    bool bar; 
} 

foo.c

Foo::Foo() 
{ 
    if(bar) 
    { 
    doSomethink(); 
    } 
} 
+10

¿Por qué no puedes inicializarlo en el constructor? – Kena

+0

porque el constructor se puede llamar más de una vez, no puedo cambiar esa rutina porque eso carecería de una mayor paz de software :( – Christoferw

+27

¿Cómo se llamaría alguna vez al constructor más de una vez? – jalf

Respuesta

63

De hecho, por defecto no se inicializa en todas. El valor que ve es simplemente algunos valores de basura en la memoria que se han utilizado para la asignación.

Si desea establecer un valor por defecto, tendrá que pedir que en el constructor:

class Foo{ 
public: 
    Foo() : bar() {} // default bool value == false 
    // OR to be clear: 
    Foo() : bar(false) {} 

    void foo(); 
private: 
    bool bar; 
} 

ACTUALIZACIÓN C++ 11:

Si puede utilizar un C++ 11 compilador, ahora se puede construir en su lugar por defecto (la mayor parte del tiempo):

class Foo{ 
public: 
    // The constructor will be generated automatically, except if you need to write it yourself. 
    void foo(); 
private: 
    bool bar = false; // Always false by default at construction, except if you change it manually in a constructor's initializer list. 
} 
+8

y, por lo tanto, tiene casi un 100% de posibilidades de que 'if (bar)' sea verdadero. –

+2

algunos compiladores inicializarán la memoria en construcciones de depuración según un patrón específico. Si utiliza uno de esos compiladores, las compilaciones de depuración tendrán 100% de probabilidad de que la barra sea verdadera. –

+1

IIRC Darwin inicializa la memoria a cero de forma predeterminada, por lo que también puede terminar con un comportamiento que parece ser inconsistente en todas las plataformas. –

1

C/C++ no inicializar variables para usted en todo. La ubicación de la memoria que ahora está siendo utilizada por la barra tiene un valor que se interpreta como "verdadero". Este no siempre será el caso. Debe inicializarlo en su constructor.

+0

Depende. Las variables miembro POD no se inicializan, pero los miembros no POD se construyen por defecto. Y, por supuesto, las variables globales/estáticas se inicializan. – jamesdlin

1

Este programa tiene un comportamiento indefinido. Los tipos intrínsecos no tienen constructores. Puede hacer bool bar = bool();, pero es mejor definir el valor real en su clase foo.

0

Prueba esto:

class Foo 
{ 
    public: 
    void Foo(); 
    private: 
    bool bar; 
} 

Foo::Foo() : bar(false) 
{ 
    if(bar) 
    { 
    doSomething(); 
    } 
} 
+0

foo() no es Foo() ... – Klaim

+0

Vaya, @Klaim me ganó para dar un ejemplo. – Bill

+0

foo() es un error tipográfico, foo() debería ser Foo() – Christoferw

-1

Puede inicializar una variable al declararla.

bool bar = 0; 
+0

creo que lo mismo, pero me sale un error C2864 luego: solo se pueden inicializar los miembros de datos integrales estáticos con una clase – Christoferw

+1

Esto es cierto para las variables locales, pero no para los miembros de la clase. – Bill

+2

Pero no antes de C++ 0x ... – Debilski

4

Klaim's answer is spot on. Para "resolver" su problema, podría usar un constructor initialization list. Le sugiero que lea esa página, ya que puede aclarar algunas consultas similares que pueda tener en el futuro.

0

Dado que está utilizando el valor de la barra en el controlador, supongo que está intentando configurarlo antes de que se cree el objeto. Creo que quisiste convertirlo en una variable de clase estática en lugar de una variable de instancia.

Cuestiones relacionadas