Как объявить статический член вектора

У меня есть некоторые проблемы, чтобы объявить статический член типа 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)
}

1

Решение

Вы неправильно понимаете, что sizeof оператор делает. Это дает вам размер данных типы, не фактических данных. Иногда размер типа данных совпадает с размером фактических данных. Это только тот случай, когда сам тип данных определяет, сколько данных может в него поместиться:

int a[50]; // 50 ints: sizeof(a) == 50 * sizeof(int)

Более того, sizeof может работать только на полный тип. Это не полный тип:

int a[];

Неполный тип — это тип, в котором отсутствует информация, необходимая для определения его размера. Вы никогда не сможете использовать sizeof чтобы получить размер a Вот.

1

Другие решения

Ваша ошибка в том, что вы пытаетесь изменить размер 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 []). Ваш код будет работать.

0

По вопросам рекламы [email protected]