2012-06-07 26 views
10

Soy totalmente nuevo en C++, así que tengan paciencia conmigo. Quiero hacer una clase con una matriz estática y acceder a esta matriz desde la principal. Esto es lo que quiero hacer en C#.Inicializador de miembro de datos de C++ no está permitido

namespace ConsoleApplication1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Class a = new Class(); 
       Console.WriteLine(a.arr[1]); 

      } 
     } 
    } 

    ===================== 

    namespace ConsoleApplication1 
    { 
     class Class 
     {  
      public static string[] s_strHands = new string[]{"one","two","three"}; 
     } 
    } 

Aquí es lo que he intentado:

// justfoolin.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <string> 
#include <iostream> 
using namespace std; 

class Class { 

    public: 
     static string arr[3] = {"one", "two", "three"}; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Class x; 
    cout << x.arr[2] << endl; 
    return 0; 
} 

pero me dio: IntelliSense: los datos miembro inicializador no está permitido

+0

No me gusta 'using namespace std;' –

Respuesta

16

Es necesario para llevar a cabo la inicialización después; no puede inicializar miembros de clase dentro de la definición de clase. (Si pudiera, entonces las clases definidas en archivos de cabecera podría hacer que cada unidad de traducción para definir su propia copia de la pieza, dejando el enlazador con un lío de resolver.)

class Class { 
    public: 
     static string arr[]; 
}; 

string Class::arr[3] = {"one", "two", "three"}; 

La definición de clase define la interfaz , que está separado de la implementación .

+0

Los miembros de datos estáticos que tienen un tipo entero se pueden inicializar en línea en C++ 03, aunque todavía se deben definir si se van a usar como un objeto. La mayoría de los miembros de datos (¿todos?) Se pueden inicializar en línea en C++ 11, aunque Visual C++ aún no admite esta característica. –

+0

No creo que C++ 11 cambie nada con respecto a los miembros de datos estáticos, solo miembros de datos de instancias. Cuando se compila un constructor, cualquier miembro de instancia previamente inicializado que el compilador haya visto se inicializa implícitamente en el constructor con el valor predeterminado. No hay magia que pueda hacer que esto funcione para miembros estáticos; un símbolo debe ser emitido en * alguna * unidad de traducción. – cdhowie

+0

Estás en lo correcto. Mi segunda oración debería haber comenzado "la mayoría de los miembros de datos no estáticos". Disculpas por la confusión. –

1

Solo los miembros de datos de tipo entero estáticos se pueden inicializar en la definición de clase. Su miembro de datos estáticos es del tipo string, por lo que no se puede inicializar en línea.

Debe definirarr fuera de la definición de clase e inicializarla allí. Debe eliminar el inicializador de la declaración y la siguiente después de su clase:

string Class::arr[3] = {"one", "two", "three"}; 

Si su clase se define en un archivo de cabecera, sus miembros de datos estáticos se deben definir en el archivo exactamente una fuente (.cpp).

También tenga en cuenta que no todos los errores que aparecen en la lista de errores en Visual Studio son errores de compilación. Notablemente, los errores que comienzan con "IntelliSense:" son errores que IntelliSense ha detectado. IntelliSense y el compilador no siempre están de acuerdo.

+0

solo datos integrales integrales estáticos, no miembros de datos enteros de tipo estático. –

0

Usted tiene que inicializar el miembro estático fuera de la declaración de la clase:

string Class::arr[3] = {"one", "two", "three"}; 
2

debe inicializar los miembros estáticos fuera de su clase, como si fuera una variable global, así:

class Class { 

    public: 
     static string arr[3]; 
}; 

string Class::arr = {"one", "two", "three"}; 
+0

solo para agregar solo datos integrales const integrales se pueden inicializar dentro de una clase. –

Cuestiones relacionadas