Инициализатор элементов данных С++ не разрешен

Я совершенно новый для С++, так что несите меня. Я хочу создать класс со статическим массивом и получить доступ к этому массиву из основного. Вот что я хочу сделать на С#.

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

Вот что я пробовал:

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

Но я получил: IntelliSense: инициализатор элемента данных не разрешен

Ответ 1

Вам нужно выполнить инициализацию позже; вы не можете инициализировать членов класса в определении класса. (Если бы вы могли, то классы, определенные в файлах заголовков, заставили бы каждую единицы перевода определить свою собственную копию члена, оставив компоновщик с беспорядком, чтобы разобраться.)

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

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

Определение класса определяет интерфейс, который отделен от реализации.

Ответ 2

Вы должны инициализировать статические члены вне вашего класса, как если бы это была глобальная переменная, например:

class Class { 

  public: 
      static string arr[3];
}; 

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

Ответ 3

В определении класса могут быть инициализированы только статические члены целочисленного типа. Ваш статический член данных имеет тип string, поэтому он не может быть инициализирован inline.

Вы должны определить arr вне определения класса и инициализировать его там. Вы должны удалить инициализатор из объявления и после класса:

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

Если ваш класс определен в файле заголовка, его статические члены данных должны быть определены только в одном источнике (.cpp).

Также обратите внимание, что не все ошибки, которые появляются в списке ошибок в Visual Studio, являются ошибками сборки. Примечательно, что ошибки, которые начинаются с "IntelliSense:", - это ошибки, обнаруженные IntelliSense. IntelliSense и компилятор не всегда согласны.

Ответ 4

Вы должны инициализировать свой статический член вне объявления класса:

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