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

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

   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: инициализатор члена данных не разрешен

4 ответов


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

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

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

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


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

class Class { 

  public: 
      static string arr[3];
}; 

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

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

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

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

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

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


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

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