Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 08.10.2017
Сообщений: 15
1

Как создать в классе статический массив типа string?

18.09.2020, 13:05. Просмотров 1129. Ответов 20
Метки нет (Все метки)

Всего есть два класса. Класс Monster имеет поля: enum раса, string имя и int HP. Второй класс MonsterGenerate рандомно генерирует поля для первого класса в своем методе и возвращает их для инициализации Monster. С хп и enum'ом всё понятно, там случайно генерируется int. А вот толково объявить и проинициализировать массив случайных имен не получается без ругани компилятора. И const пробовал вписывать, и инициализацию за пределами класса. Пишет:

Кликните здесь для просмотра всего текста
Ошибка C2040 randomName: "std::string" отличается по уровням косвенного обращения от "std::string [3]"


C++
1
2
3
4
5
6
7
8
9
10
11
class MonsterGenerator
{
public:
    static string randomName[3]; // здесь затуп
    static Monster generateMonster()
    {
        return Monster (static_cast <Monster::MonsterType> (rand() % Monster::MonsterType::MAX_MONSTER_TYPES), "asd"/*randomName[rand() % 3]*/, rand() % 80 + 20);
    }
};
 
string MonsterGenerator::randomName = { "Sokolov", "Evegeniy", "Kravchenko" }; //и здесь
Может нужно динамически выделять память или через char, кто знает?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2020, 13:05
Ответы с готовыми решениями:

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с...

создать статический массив строк как статический массив указателей на строки, задание ниже -->
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

Как создать массив строк типа String^?
Как создать массив строк типа String^ ?

20
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 13:08 2
У тебя тип объявлен как string, а ты пытаешься переменную инициализировать списком из указателей. Что ты ожидаешь там в переменной в итоге увидеть?
1
4 / 4 / 0
Регистрация: 08.10.2017
Сообщений: 15
18.09.2020, 13:17  [ТС] 3
Vourhey, но почему, разве не так инициализируются массивы string?
0
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 13:24 4
Лучший ответ Сообщение было отмечено Miracle_Creator как решение

Решение

Цитата Сообщение от Miracle_Creator Посмотреть сообщение
string MonsterGenerator::randomName
А где в этом объявлении указано, что randomName это массив string?
1
25 / 19 / 9
Регистрация: 26.01.2013
Сообщений: 145
18.09.2020, 13:25 5
забудьте про C массивы - используйте std::vector
0
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 13:29 6
Цитата Сообщение от bars268 Посмотреть сообщение
забудьте про C массивы - используйте std::vector
На фиг не нужно, пока его функционал не используется.
0
25 / 19 / 9
Регистрация: 26.01.2013
Сообщений: 145
18.09.2020, 13:36 7
Цитата Сообщение от Vourhey Посмотреть сообщение
На фиг не нужно, пока его функционал не используется.
Что значит не используется? Он может все то же самое что и обычный сишный массив, только следить за памятью не нужно. Разве это не жирный плюс для современного программирования?
С другой стороны если привыкли прогать на чистых сях и не смотреть на современные стандарты то ок, каждый пишет код как хочет.
0
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 13:39 8
Цитата Сообщение от bars268 Посмотреть сообщение
Что значит не используется?
То и значит. Ничего с этим массивом не делается, ради чего нужно тащить вектор.
Цитата Сообщение от bars268 Посмотреть сообщение
Он может все то же самое что и обычный сишный массив, только следить за памятью не нужно.
А в примере автора и так не нужно за памятью следить.
Цитата Сообщение от bars268 Посмотреть сообщение
Разве это не жирный плюс для современного программирования?
Какой плюс? Памятю разбрасываться направо и налево, таща STL-классы там где надо и не надо? Ну да, современное программирование оно такое: меньше думать, больше библиотек.
2
25 / 19 / 9
Регистрация: 26.01.2013
Сообщений: 145
18.09.2020, 13:48 9
Цитата Сообщение от Vourhey Посмотреть сообщение
Памятю разбрасываться направо и налево таща STL-классы там где надо и не надо
Если вы кодите под платформы с жестким ограничем по памяти вопросов конечно нет.
Цитата Сообщение от Vourhey Посмотреть сообщение
современное программирование оно такое: меньше думать, больше библиотек
Если нравится страдать и изображать бурную деятельность имплементируя собственные удобные строки и работу с ними ваше, опять же, дело. STL тщательно прорабатывается комитетом чтобы было удобно, просто и быстро, о каких "больше библиотеках" речь?
0
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 13:52 10
Цитата Сообщение от bars268 Посмотреть сообщение
Если вы кодите под платформы с жестким ограничем по памяти вопросов конечно нет.
Платформы тут не при чем. vector в примере атвора не несете никаких преимуществ ни по памяти, ни по удобству.

Добавлено через 1 минуту
Цитата Сообщение от bars268 Посмотреть сообщение
Если нравится страдать и изображать бурную деятельность имплементируя собственные удобные строки и работу с ними ваше, опять же, дело. STL тщательно прорабатывается комитетом чтобы было удобно, просто и быстро, о каких "больше библиотеках" речь?
string names[3] ={..};
и записывается короче, и работает быстрее работает, чем
vector<string> names = {...};
Следовательно, здесь vector ни в каких смыслах не лучше.
0
25 / 19 / 9
Регистрация: 26.01.2013
Сообщений: 145
18.09.2020, 13:55 11
Цитата Сообщение от Vourhey Посмотреть сообщение
быстрее работает
а с чего бы оно быстрее работало?
Да и кстати, затаскивая стринг в любом случае затащить вектор уже не стоит много.
Цитата Сообщение от Vourhey Посмотреть сообщение
записывается проще
А вот как по мне первое - легаси.
0
3427 / 1910 / 801
Регистрация: 07.02.2019
Сообщений: 5,145
18.09.2020, 14:10 12
Цитата Сообщение от bars268 Посмотреть сообщение
а с чего бы оно быстрее работало?
С вектором дополнительная косвенность, что не очень кэш-дружелюбно.
Цитата Сообщение от bars268 Посмотреть сообщение
А вот как по мне первое - легаси.
Смущает голый массив - есть std::array
0
4 / 4 / 0
Регистрация: 08.10.2017
Сообщений: 15
18.09.2020, 14:10  [ТС] 13
Цитата Сообщение от Vourhey Посмотреть сообщение
А где в этом объявлении указано, что randomName это массив string?
Вот за это спасибо. Честно говоря, не знал что при определении static'а за пределами области видимости нужно всё это ещё раз указывать. Хотя вроде логично.
0
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 14:19 14
Цитата Сообщение от Miracle_Creator Посмотреть сообщение
Вот за это спасибо. Честно говоря, не знал что при определении static'а за пределами области видимости нужно всё это ещё раз указывать. Хотя вроде логично.
Конечно. Определение должно соответствовать объявлению
1
91 / 69 / 31
Регистрация: 29.06.2020
Сообщений: 370
18.09.2020, 14:21 15

Не по теме:

Цитата Сообщение от Vourhey Посмотреть сообщение
string names[3] ={..};
захотел добавить еще одного мостра, и лопать весь код



А по теме ничего и не подсказали человеку.
Miracle_Creator,
Вы забыли указать что это массив
C++
1
string MonsterGenerator::randomName[] = { "Sokolov", "Evegeniy", "Kravchenko" }; //и здесь
1
Почетный модератор
7321 / 2587 / 268
Регистрация: 29.07.2006
Сообщений: 13,582
18.09.2020, 14:26 16
Цитата Сообщение от bars268 Посмотреть сообщение
а с чего бы оно быстрее работало?
С того, что в векторе сидит еще один дополнительный буфер.
Цитата Сообщение от bars268 Посмотреть сообщение
Да и кстати, затаскивая стринг в любом случае затащить вектор уже не стоит много.
Достаточно отсуствия причин его тащить, чтобы его не тащить. Он не делает код ни читаемее, ни быстрее. Смысла - 0.
Цитата Сообщение от bars268 Посмотреть сообщение
А вот как по мне первое - легаси.
Как по тебе - не важно. Написано короче. Пока не поступило аругментов, чтобы писать длиннее, кроме "современное программирование бла-бла-бла..."

Добавлено через 27 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
захотел добавить еще одного мостра, и лопать весь код
Автор в коде ничего не добавляет. Свои желания что-то куда-то добавить оставь при себе, а не приписывай другим людям.

Добавлено через 53 секунды
Цитата Сообщение от SmallEvil Посмотреть сообщение
А по теме ничего и не подсказали человеку.
Он уже все понял, что ему надо.
0
SmallEvil
18.09.2020, 14:27
  #17

Не по теме:

Vourhey, зато вы что то всем пытаетесь приписать, обидели что ли ?

0
Vourhey
18.09.2020, 14:32
  #18

Не по теме:

Цитата Сообщение от SmallEvil Посмотреть сообщение
Vourhey, зато вы что то всем пытаетесь приписать
например?

0
фрилансер
1441 / 1008 / 292
Регистрация: 11.10.2019
Сообщений: 3,206
18.09.2020, 17:58 19
Miracle_Creator,
C++
1
2
3
4
5
6
7
8
9
10
class MonsterGenerator
{
public:
    inline static std::vector<std::string> randomName
    {
        "Sokolov",
        "Evegeniy",
        "Kravchenko",
    };
};
0
С чаем беда...
Эксперт CЭксперт С++
7875 / 3801 / 1044
Регистрация: 18.10.2014
Сообщений: 8,083
18.09.2020, 18:30 20
Цитата Сообщение от bars268 Посмотреть сообщение
забудьте про C массивы - используйте std::vector
Никакого std::vector тут даже близко не должно быть.

Массив фиксированного размера - либо чистый C-массив, либо std::array. Для того и придумали std::array, чтобы прекратить этот дикий, кривой и косой антипатерен с попытками использовать std::vector в таких случаях.

Цитата Сообщение от Miracle_Creator Посмотреть сообщение
Честно говоря, не знал что при определении static'а за пределами области видимости нужно всё это ещё раз указывать. Хотя вроде логично.
Не нужно уже давно. Пользуйтесь inline, как показано в сообщении Алексей1153 выше.

"Нужно всё это ещё раз указывать" - это для случаев, когда вы хотите контролировать поряждок инициализации. Вам здесь это не нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2020, 18:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как создать массив переменных типа String^?
1) Как создать массив переменных типа String^ ? 2) Как перевести переменную типа String^ to string...

Как инициализировать статический константный массив в классе?
Например, есть класс, которой статически хранит виды себя. Не могу понять как его инициализировать...

Как создать и заполнить динамический массив строк типа std::string?
Как создать и заполнить динамический массив строк типа string? Если заполнять массивы через...

Как объявить в классе переменную типа String
Объявление переменной класса типа String String^ My_String = &quot;Hello&quot;; вызывает множество ошибок...

Поле типа string в классе, как и где лежит?
Всем привет! Возник теоретический вопрос. Когда я создаю свой класс и в нем добавляю поле типа...

Как в классе создать атрибут типа массив (двумерный) и потом в других классах использовать этот атрибут?
Подскажите плз. как в классе создать атрибут типа массив (двумерный) и потом в других классах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.