У меня есть некоторые проблемы, чтобы объявить статический член типа std::vector<std::string>
в принципе я могу заменить его на массив std::string[]
,
У меня много неприятностей: если я объявлю это как static
и затем я инициализирую в реализации (файл cpp), это работает, но если я хочу создать новый класс, наследующий от первого во втором файле, он жалуется на
error: invalid application of ‘sizeof’ to incomplete type ‘std::string []’
Если я добавлю это в заголовок, у меня возникнут проблемы с двойными объявлениями.
Как правильно? Должен ли я использовать extern? Как?
Я:
file_A.h:
class A { public: static string s[]; }
file_A.cpp:
string A::s[] = { ... };
file_B.h
class B : public A
file_B.cpp
void B::function()
{
for (string* s = A::s; s != A::s + sizeof(A::s) / sizeof(string); ++s)
}
Вы неправильно понимаете, что sizeof
оператор делает. Это дает вам размер данных типы, не фактических данных. Иногда размер типа данных совпадает с размером фактических данных. Это только тот случай, когда сам тип данных определяет, сколько данных может в него поместиться:
int a[50]; // 50 ints: sizeof(a) == 50 * sizeof(int)
Более того, sizeof
может работать только на полный тип. Это не полный тип:
int a[];
Неполный тип — это тип, в котором отсутствует информация, необходимая для определения его размера. Вы никогда не сможете использовать sizeof
чтобы получить размер a
Вот.
Ваша ошибка в том, что вы пытаетесь изменить размер string s[]
, Компилятор ничего не знает о размере вашего строкового массива.
Например:
void B::function()
{
for (string* s = A::s; s != A::s + sizeof(A::s) / sizeof(string); ++s)
}
В вашей функции вместо sizeof (). Ты можешь использовать for (int i = 0; !A::s[i].empty(); ++i)
получить размер массива строк.
PS. Если вы не используете sizeof (string []). Ваш код будет работать.