2012-06-07 22 views
10

Sono totalmente nuovo al C++, quindi portami con me. Voglio creare una classe con un array statico e accedere a questo array dal main. Ecco cosa voglio fare in C#.L'inizializzatore del membro dati C++ non è consentito

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"}; 
     } 
    } 

Ecco quello che ho provato:

// 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; 
} 

ma ho ottenuto: IntelliSense: i dati membro inizializzatore non è permesso

+0

No me gusta' using namespace std; ' –

risposta

16

È necessario eseguire l'inizializzazione in seguito; non è possibile inizializzare i membri della classe all'interno della definizione della classe. (Se si potesse, quindi classi definite nei file di intestazione causerebbe ciascuna unità di traduzione per definire la propria copia dell'organo, lasciando il linker con un disordine da risolvere.)

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

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

La definizione della classe definisce l'interfaccia , che è separato dall'implementazione .

+0

I membri di dati statici con tipo intero possono essere inizializzati inline in C++ 03, sebbene debbano essere ancora definiti se devono essere utilizzati come oggetto. La maggior parte dei membri di dati (tutti?) Possono essere inizializzati inline in C++ 11, sebbene Visual C++ non supporti ancora questa funzione. –

+0

Non penso che C++ 11 cambi qualcosa rispetto ai membri dei dati statici, solo membri di dati di istanza. Quando un costruttore viene compilato, qualsiasi membro di istanza precedentemente inizializzato che il compilatore ha visto viene inizializzato implicitamente nel costruttore con il default visto. Non c'è magia che possa fare questo lavoro per i membri statici; un simbolo deve essere emesso in * alcune * unità di traduzione. – cdhowie

+0

Sei corretto. La mia seconda frase avrebbe dovuto iniziare "la maggior parte dei membri non statici dei dati". Scuse per la confusione. –

1

Solo i membri di dati di tipo intero statici possono essere inizializzati nella definizione di classe. Il membro dei dati statici è di tipo string, quindi non può essere inizializzato in linea.

È necessario definirearr al di fuori della definizione della classe e inizializzarlo lì. È necessario rimuovere l'inizializzazione dalla dichiarazione e il seguente testo dopo la classe:

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

Se la classe è definita in un file di intestazione, i suoi membri dati statici dovrebbero essere definiti in un file esattamente una sorgente (cpp).

Si noti inoltre che non tutti gli errori visualizzati nell'Elenco errori in Visual Studio sono errori di generazione. In particolare, gli errori che iniziano con "IntelliSense:" sono errori rilevati da IntelliSense. IntelliSense e il compilatore non sono sempre d'accordo.

+0

solo dati integrali statici const non statici membri di dati di tipo intero. –

0

si deve inizializzare il membro statico al di fuori della dichiarazione di classe:

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

è necessario inizializzare i membri statici di fuori della classe, come se fosse una variabile globale, in questo modo:

class Class { 

    public: 
     static string arr[3]; 
}; 

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

solo per aggiungere solo i membri di dati integrali const statici possono essere inizializzati all'interno di una classe. –

Problemi correlati