Инициализатор элементов данных С++ не разрешен
Я совершенно новый для С++, так что несите меня. Я хочу создать класс со статическим массивом и получить доступ к этому массиву из основного. Вот что я хочу сделать на С#.
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"};