Методы std::string
Пример с чаром:
char *str="abcd";
std::cout << str[1]
Выводит b
Тоесть указать позицыю символа в строке и получить его
std::cout не имеет отношения к классам строк. Это объект потокового класса.
возвращающий указатель на область памяти со строкой, разумеется const. Может проблема в том, что в программе есть методы, работающие именно с указателем а не с std::string, но эта проблема благополучно решается. В книге советов Майерса по эффективному использованию STL подобные вещи рассматриваются.
Есть структура в ней есть std::string Name. Создаю динамический массив этой структуры
Выделяю память
Tobj=(TEMLER_ptr*)malloc(sizeof(TEMLER_ptr));
А потом Name заполняю чемто.
Tobj[0].Name=”cvbc”;
После компиляции запускаеться программа, а потом выдает ошибку.
Самое интересное если сделать через new то работает. Но мне надо через malloc.
Подскажи как устранить такую ошибку.
Насщет STL надо взяться как то, думаю хорошая штука
Tobj[0].Name=”cvbc”;
так ты не заполняешь, а присваиваешь указатель на константный строковый литерал ”cvbc”. Что плохо и опасно. Если хочешь так копировать тогда уж strcpy.
А раз уж ты исспользуешь C++ то и пиши C++, а не на С.
...
delete obj;
Поиск по форуму! Тема не раз поднималась и обсуждалась!!
Нет, aks, ты не прав. Тебя, видимо, запутал malloc.
Автор говорил:
Есть структура в ней есть std::string Name.
Выделяю память
Tobj=(TEMLER_ptr*)malloc(sizeof(TEMLER_ptr));
А потом Name заполняю чемто.
Tobj[0].Name=”cvbc”;
Что-то я здесь не вижу массива...
Самое интересное если сделать через new то работает.
Все правильно. Определись, чем new отличается от malloc.
Вот наглядный пример, что нельзя с классами работать через malloc.
Но мне надо через malloc.
Зачем?!
Все равно придется эмулировать new[], т.е. попросту самому писать код этого оператора.
Подскажи как устранить такую ошибку.
Использовать new[], а лучше взять готовый контейнер, например, std::vector.
Я читал что new лудше работает с классами, но и с malloc у мнея работало в себилдере прекрасноо токо там я использовал место std::string AnsiString (я так понимаю они очень похожи!).
Green насчет new я бы его с удовольствием использовал бы, но мне надо динамически увеличивать память.
Это не массив, а разындексирование.
Tobj - массив из одного элемента?
Я читал что new лудше работает с классами, но и с malloc у мнея работало в себилдере прекрасноо
Значит, ты не разобрался, чем new отличается от malloc.
Ликбез я устраивать не буду, постарайся сам разобраться, ну или спроси у др. участников форума.
токо там я использовал место std::string AnsiString (я так понимаю они очень похожи!).
Понятия не имею, как AnsiString устроен внутри, а ведь вся проблема именно в реализации. А пользоваться классом с учетом реализации - противоречит принципам ООП и приводит к ошибкам подобным тем, с которой ты столкнулся.
Green насчет new я бы его с удовольствием использовал бы, но мне надо динамически увеличивать память.
Ну так и с помощью new можно увеличивать память.
Только проще и удобнее использовать готовые контейнеры, чем городить свои. Используй STL, если уж начал. :)