Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
i8086
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 9
#1

Вернуть С-строку из обьекта класса - C++

16.07.2013, 14:51. Просмотров 685. Ответов 15
Метки нет (Все метки)

Есть класс, у него метод c_str. Какой лучший способ вернуть С-строку?
1)
C++
1
2
3
void c_str(char* str) {
// сформировать строку и записать в str
}
2)
C++
1
2
3
4
5
char* c_str(void) {
static char str[255];
// сформировать строку и записать в str
return str;
}
Другие способы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 14:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вернуть С-строку из обьекта класса (C++):

Инициализация обьекта класса списком C++ - C++
Здравствуйте, кому не сложно расскажите в кратце как мне сделать вот такую штуку: у меня есть некий класс реализующий бинарное дерево ...

Ошибка при создании обьекта класса - C++
Объясните пожалуйста почему нельзя создать обьект другого класса в private. В чем ошибка ? Код: class Goods{ public: ...

Запись в файл данных из обьекта класса - C++
подскажите пожалуйста,как записать данные из обьекта g4 в файл,что-то пытаюсь,но никак не могу понять. строка 181 //#include...

Инициализация обьекта внутри другого класса - C++
Всем привет. Вообщем проблема такая. Есть несколько классов class WeaponType { }; class Swords : public WeaponType { }; ...

возврат копии обьекта класса из метода - C++
Привет всем. Есть класс ниже в нём operator+. Помогите компилятор выдаёт ворнинг warning C4172: returning address of local variable or...

Ошибка ввода строки следующего обьекта класса (C++) - C++
Добрый вечер всем! Проблема в том, что после ввода строки обьекта базового класса в следующим производном нету возможности для его...

15
Kastaneda
Jesus loves me
Эксперт С++
4730 / 2934 / 242
Регистрация: 12.12.2009
Сообщений: 7,443
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 14:57 #2
Лучше в классе хранить char *str, в c_str() выделять под него память и его же возвращать и в деструкторе не забыть освободить занимаемую им память. А вообще без контекста сложно сказать.
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
16.07.2013, 14:58 #3
Можно и без static
C++
1
2
3
4
5
char* c_str(void) {
char* str=new char[255];
// сформировать строку и записать в str
return str;
}
0
i8086
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 9
16.07.2013, 15:08  [ТС] #4
А если строка каждый раз меняется, память выделять только один раз?
Т. е. как такой вариант?
C++
1
2
3
4
5
6
7
8
9
10
char* c_str(void) {
// str - member
if(nullptr != str) {
     str=new char[255];
}
// сформировать строку и записать в str
return str;
}
 
// в десрукторе освободить память
0
Croessmah
Пришел
Эксперт CЭксперт С++
13764 / 7845 / 894
Регистрация: 27.09.2012
Сообщений: 19,258
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 15:10 #5
Если имеется ввиду объект класса на подобии std::string, то можно в конец строки(если буфера хватает) дописать '\0' и вернуть указатель на строку:
C++
1
2
3
const char * c_str(){
//...
}
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2013, 16:26 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Если имеется ввиду объект класса на подобии std::string
то там уже хранится 0 в конце.
0
Croessmah
Пришел
Эксперт CЭксперт С++
13764 / 7845 / 894
Регистрация: 27.09.2012
Сообщений: 19,258
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 16:33 #7
Цитата Сообщение от Tulosba Посмотреть сообщение
то там уже хранится 0 в конце.
но это же не обязательно, поэтому и написал, чтобы присвоили
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
16.07.2013, 20:11 #8
Цитата Сообщение от i8086 Посмотреть сообщение
void c_str(char* str) {
// сформировать строку и записать в str
}
Если класс сам по себе не хранит строку, а генерирует её по запросу, то лучше так.
Если это нечто вроде std::string, который внутри хранит эту строку, то лучше const char * c_str()

Добавлено через 15 минут
Вообще, не стоит забывать, что string::c_str очень специфичная функция, возвращающая временный указатель на С-строку, который крайне вероятно станет невалидным после почти любого действия со строкой.
поэтому, в любом случае, при получении С-строки из string
если расчитываешь где-то ею долго и надёжно пользоваться,
необходимо срочно скопировать эту результат, полученный из c_str() в свой надёжно выделенный в памяти массив char
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2013, 20:29 #9
Kuzia domovenok, const функции можно использовать и не прибегая к предварительному копированию буфера.
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
16.07.2013, 20:51 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Kuzia domovenok, const функции можно использовать и не прибегая к предварительному копированию буфера.
Tulosba, смотря как использовать.
Захотел я просто вывести строку через сишный указатель. Пожалуйста!
C++
1
2
std::string s("Hello");
std::cout<<s.c_str();//всё ОК!
Захотел я Сделать то же самое, но чуть попозже:
C++
1
2
3
4
5
6
7
8
std::string s("Hello");
const char* ptr=s.c_str();//Запомним c_str() и подождём;
...//ещё подождём
s="YOUR STRING IS DOOMED! MU-HA-HA!";//(А тем временем, пока мы ждём!)
//И вспомним про указатель. 
//(КОНСТАНТНЫЙ!)мы ни его ни в нём ничего не меняли ж
std::cout<<ptr;
//АХТУНГ!!!!!
Добавлено через 13 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
const функции можно использовать и не прибегая к предварительному копированию буфера.
Tulosba, кстати, а что ты имел в виду под "конст-функциями"?
То, что это const char* c_str() const;
Или то, что это const char* c_str() const;
Первое запрещает получателю c_str() менять данные в буфере, но этот буфер сам может измениться у отправителя, как в примере выше.
Второе вообще лишь говорит нам, что метод c_str может вызываться не только у строковых переменных, но и у констант (const std::string s и к теме не имеет отношения.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2013, 21:25 #11
Kuzia domovenok, я имел в виду функции, которые не изменяют состояние объекта. length(), capacity(), find() и т.д.
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
16.07.2013, 21:29 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Kuzia domovenok, я имел в виду функции, которые не изменяют состояние объекта. length(), capacity(), find() и т.д.
Состояние объекта они не изменяют. Зато состояние возвращённого c_str указателя может внезапно измениться вообще на невалидное.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2013, 21:34 #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зато состояние возвращённого c_str указателя может внезапно измениться вообще на невалидное.
Пруф?
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
16.07.2013, 21:38 #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Пруф?
Пост 10!!!!!
C++
1
2
3
4
5
6
7
8
std::string s("Hello");
const char* ptr=s.c_str();//Запомним c_str() и подождём;
...//ещё подождём
s="YOUR STRING IS DOOMED! MU-HA-HA!";//(А тем временем, пока мы ждём!)
//И вспомним про указатель. 
//(КОНСТАНТНЫЙ!)мы ни его, ни в нём ничего не меняли же!
std::cout<<ptr;
//АХТУНГ!!!!!
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2013, 21:43 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Пост 10!!!!!
Хе-хе. А 4 строка стало быть не модифицирует s?
p.s. В стандарте что-то не нашел. Но вот тут четко сказано:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
0
16.07.2013, 21:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 21:43
Привет! Вот еще темы с ответами:

Ошибка при записи в файл данных из обьекта класса - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace std; class Vector { public: double x; ...

Исключительный доступ обьекта к полям другого обьекта avr/c++ - C++
исключительный доступ обьекта к полям другого обьекта avr/c++ добрый день есть два обьекта Data &amp; Math - Data - элемент...

Вернуть массив из класса - C++
#include &lt;iostream&gt; using namespace std; class gueue { public: int out(); }; int gueue::out() {

Вернуть двухмерный вектор с класса? - C++
Как правильно вернуть матрицу созданною через вектора из класса, в котором она созданная? вот мой код: #include &lt;iostream&gt; #include...


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

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

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