Tengo un array de objetos de la clase, y dentro de la clase de objeto que tengo otra matriz que yo necesitaría para inicializar a todos los ceros. El código se compila y se ejecuta, pero el resultado se muestra C
en lugar de 0.

Desde el archivo de encabezado:

class Cache {
private:
    int byte[16];
public:
    Cache();
    int getBytes(int);
    ~Cache();
};

Desde el archivo cpp

Cache::Cache()  
{
    byte[16]={0};
}

int Cache::getBytes(int j){
    return byte[j];
}

desde el otro archivo cpp

for (int i = 0; i < 16; i++) 
{
    for (int j = 0; j < 16; j++)  //visual check of initializes main memory
    {
        cout << cache[i].getBytes(j) << " ";
}
}

Es este ser configurado correctamente? Como ya he mencionado, getBytes está volviendo a la ‘C’ en lugar de ‘0’ s como se esperaba.

  • Fyi: C++11 permite a valor intiialize en el constructor de la lista de inicializador: Cache::Cache() : byte() {}, por ejemplo. Este será el valor de inicialización de cada elemento, que para escalar medios de inicialización de cero, que es exactamente lo que usted desea.
  • Esa es la manera de hacerlo en C++03 demasiado. He añadido una respuesta, pero estoy seguro de que he hecho esto antes, así que estoy buscando el duplicado.
  • Sé que hay al menos un par por ahí (he escrito algunos, y estoy seguro de que he escrito un poco demasiado =P). Para la vida de mí no puedo encontrarlos, sin embargo. No sabía que era un 03x cosa. Nunca he pegado a la media, las especificaciones, la espera en su lugar hasta que finalmente consiguió 11.
  • Yo no considerar 03 como un medio de especificaciones. Yo diría que el 98 nunca sucedió realmente 🙂
  • LOL. Creo que no estás solo en el deseo de fingir que era el caso =P
InformationsquelleAutor Anik | 2014-06-02

6 Comentarios

  1. 29

    Solo uso valor de inicialización en el constructor de la lista de inicialización. Que es el idiomáticas manera de hacer esto en C++.

    Cache::Cache() : byte()
    { 
    }

    Tenga en cuenta que C++11 permite a esta sintaxis también:

    Cache::Cache() : byte{}
    { 
    }

    En caso de que usted se está preguntando por qué esto funciona, desde el C++ 11 (nota: esto se aplica también a la de C++03):

    C++11 § 8.5,p10

    Un objeto cuya inicializador es un conjunto de paréntesis vacío, es decir, (), será valor inicializado.

    Ese término valor inicializado nos lleva a:

    C++11 § 8.5,p7

    Valores para inicializar un objeto de tipo T significa:

    • si T es un (posiblemente cv-calificado) tipo de clase9 con un proporcionados por el usuario constructor (12.1), entonces el constructor predeterminado para T se llama (y la inicialización está mal formado, si T no es accesible constructor predeterminado);

    • si T es un (posiblemente cv-calificado) no unión de tipo de clase, sin proporcionado por el usuario constructor, entonces el objeto es inicializada en cero y, si T implícitamente-declaró constructor predeterminado es no trivial, que el constructor es llamado.

    • si T es un tipo de matriz, cada elemento es el valor inicializado;

    • de lo contrario, el objeto es inicializada en cero.

    La tercera opción en este viaje el valor de inicialización de cada elemento; el cuarto se aplica una vez que llegamos a cada uno de esos elementos porque son (a) la clase de tipos, por lo que (1) y (2) se han ido, y (b) no se matrices, por lo que (3) se ha ido. Eso deja sólo la última, y sus elementos son inicializados a cero.

    • +1 añadido estándar de citar.
    • Gracias!
    • Que hizo el truco. Muchas gracias por su ayuda!
  2. 5

    En Cache constructor, cuando se hace :

    byte[16]={0};

    Que son sólo la configuración de los 16 bytes de la matriz (que está fuera de los límites, por lo que esta operación tiene un comportamiento indefinido). Matriz de objetos defecto son inicializados en C++, ya que la tienda int, no la inicialización se realiza.

    Puede utilizar std::fill para inicializar :

    Cache::Cache()  
    {
      std::fill(byte, byte+16, 0);
    }

    O puede utilizar un habitual en bucle encima de su matriz.

    • Que se encargó de él. Gracias por su ayuda!
  3. 2

    memset es la solución más sencilla.

    Cache::Cache()  
    {
      memset(byte, 0, sizeof(byte));
    }
    • std::fill funciona como memset para los tipos char , pero funciona correctamente para los otros tipos, por lo que es tal vez una mejor opción (además de ser menos propensos a sufrir de los argumentos en el orden equivocado!)
  4. 2

    Que están haciendo mal en muchos niveles. La sintaxis que se utiliza no hacer lo que usted piensa. Lo que están haciendo ahora es esencialmente la inicialización de 17 de elemento de la tabla a 0.

    En su caso memset es probablemente la forma más rápida y simple. Sin embargo, no iba a funcionar para los tipos complejos, así que considere la posibilidad de escribir un simple fragmento de código para el caso general como:

    template<typename T>
    inline void zero_init(T array[], size_t elements){
     if( std::is_pod<T>() ) memset(array, 0, sizeof(T)*elements);
     else std::fill(begin(array), begin(array)+elements, 0);
    }

    Esta forma se comprueba si el tipo es una VAINA tipo, que en este contexto significa que puede ser inicializado a través de memset y pondrá 0 para toda la tabla. Si el T no lo soporta, entonces para cada elemento de un equivalente de element = 0 será llamado. También la comprobación de que es posible de ser evaluado en el tiempo de compilación, por lo que la mayoría probablemente el if será compilado de distancia y un simple «one-liner» versión va a ser creado para cada tipo en el momento de la compilación.

    Se le puede llamar a través de:

    Cache::Cache()  
    {
      zero_init(byte, 16);
    }
    • El modo más rápido y sencillo es el valor de inicialización (véase mi respuesta.)
    • Sí, por cero de inicialización que se realiza en tiempo de compilación. Probablemente no tiene sentido utilizarlo en otro tipo de situaciones (como una plantilla para algo más). Pero creo que lo voy a dejar todo, a pesar de que su respuesta hace bastante inútil. Bien, lástima que no tengo estándar en la cabeza para llegar a este tipo de niza respuestas. Tan celoso. =)
  5. 1

    Hay dos problemas con el código:

    byte[16]={0};

    Matriz tiene 0 índice de base, por lo que el máximo índice en este caso puede ser 15, no 16. Usted está corrompiendo a la memoria.

    Segundo, tiene que recorrer todos los elementos e inicializar. La forma en que se están inicializando será realizada por un solo elemento.

    Cache::Cache()  
    {
      for(int i=0;i<16;i++)
       byte[i]=0;
    }
  6. 0

    La inicialización de un array con {0} sólo funciona sobre la declaración de la matriz.

    Usted necesita un bucle dentro del constructor que establece los elementos de la matriz a cero.

Dejar respuesta

Please enter your comment!
Please enter your name here