Ассоциативный массив.
Вопрос:
Как правильно сделать контейнер map, чтобы ключем была строка, а значением массив объектов?
Пишу так:
Day day[6];
typedef map<string, day> Spisok;
Spisok spisok;
Выдется ошибка (в C++Builder):
Member Workspace::day cannot be used without an object
Что делать и как быть?
Заренн благодарен.
Код:
typedef map<string, day> Spisok;
тут у тебя day - это не тип данных, а переманная.
нужно так:
Код:
typedef map<string, Day* > Spisok;
Цитата: P*t*
Код:
typedef map<string, day> Spisok;
тут у тебя day - это не тип данных, а переманная.
нужно так:
Код:
typedef map<string, Day* > Spisok;
Хм... возможны серьезные проблемы при использовании указателя т.о.:
утечка памяти, попытка удаления автоматических и статических переменных.
Лучше обернуть массив (т.к. сами по себе массивы не могут храниться в контейнерах):
Код:
struct Days
{
Day day[6];
};
typedef map<string, Days> Spisok;
Spisok spisok;
{
Day day[6];
};
typedef map<string, Days> Spisok;
Spisok spisok;
Кстати, в boost есть уже готовая соотв. обертка для массивов.
Да, примерно к такому же решению я и пришел (только сделал это в Day.h, объявив новый класс), но Ваш вариант удобнее :)
Далее, странное дело, но у меня выдается ошибка при компиляции в файле _pair.h:
Undefined structure 'string'
Так и не смог разобраться, почему, собственно, выдает.
P.S.
Прощу прощения у админов и простых смертных, что тема размещена не в теме C++Builder - так получилось)
Вот я создаю такой контейнер, все хорошо (это при учете того, что найдется решение проблемы, написанной выше), а теперь я пытаюсь добавить пару: строку и мой тип.
Вопрос - строк и объектов типа Days будет много. Количество зависит от БД, но это отдельная песня. Как мне реализовать добавление новых пар, с учетом неопределенного их количества?
С STL только начинаю знакомиться, но уже очень надо
spisok["mystring"] = myval;
Таким образом добавится одна пара. А вот объектов myval будет куда как больше. И мне что, при создании пар, надо будет создавать такое же количество уникальных индентификаторов?
spisok[mystring1] = myval1;
spisok[mystring2] = myval2;
spisok[mystring3] = myval3;
//причем повторяюсь, кол-во пар я не знаю
Может есть какие-нибудь проверенные стандартные средства?
что тебе мешает использовать в качестве идентификатора, скажем, уникальный id записи в БД?
что вообще в этом ассоц. массиве будет храниться? зачем хранить отдельными кусками по несколько объектов? и что планировалось изначально использовать в качестве ключа? :)
В качестве ключа-идентификатора будет использоваться имя столбца БД.
В массиве хранится вот что:
Ключ - имя учебной группы
Значение - 6 (по кол-ву рабочих дней) структур, в которых описывается дни недели с теми парами (еще структура), которые в этот день есть.
Суть контейнера - хранить рассписание учебных групп. Суть класса - выводить на экран, предоставлять доступ (чтение, запись) к кокрнетным парам, конкретных дней, конкретнвых групп. Во :)
Но ламерские вопросы я так и продолжу задавать))
Рассмотрим ф-ию:
GetPrivateProfileString("smth", "smb", "A", symbol, 2, "settings.ini");
где
char symbol[1];
Естественно, в symbol записывается "A". А должно быть другое значение. Почему так? (settings.ini находится в той же папке, что и exe-файл)