Инициализатор элемента данных 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"};