N>//hostAddress — какой-то самопальный String
N>auto_ptr<char> host(new char[conf.hostAddress.length()+1]); N>strncpy(&(*host), conf.hostAddress, conf.hostAddress.length());
N>и если так можно — то нельзя как-нить покрасивше?
Пользоваться нормальным std::string. И еще, авто поинтеры не принято применять в качестве контейнеров ( в твоем случае ходер массива ), открой имплементацию класса auto_ptr и загляни в дистрактор. В данном примере ничего страшного не произойдет, но если бы речь шла о массиве структур/классов, то при разрушении холдера в его дистракторе вызывался бы дистрактор твоей структуры/класса только для первого эелемента массива.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Здравствуйте, Batiskaf, Вы писали:
B>Здравствуйте, Nickolas, Вы писали:
N>>//hostAddress — какой-то самопальный String
N>>auto_ptr<char> host(new char[conf.hostAddress.length()+1]); N>>strncpy(&(*host), conf.hostAddress, conf.hostAddress.length());
N>>и если так можно — то нельзя как-нить покрасивше?
B>Пользоваться нормальным std::string.
С прибольшим бы удовольствием Но есть третья библиотечка, функции которой требуют char*, т.е. string я не могу им передать. Или я ошибаюсь?
например int connect( char * host );
у меня есть Str host, который может только в const char* кастить. Использовать const_cast не хочется.
Могу я что-то сделать со string?
>>И еще, авто поинтеры не принято применять в качестве контейнеров ( в твоем случае ходер массива ), открой имплементацию класса auto_ptr и загляни в дистрактор. В данном примере ничего страшного не произойдет, но если бы речь шла о массиве структур/классов, то при разрушении холдера в его дистракторе вызывался бы дистрактор твоей структуры/класса только для первого эелемента массива.
Здравствуйте, Nickolas, Вы писали:
B>>Пользоваться нормальным std::string. N>С прибольшим бы удовольствием Но есть третья библиотечка, функции которой требуют char*, т.е. string я не могу им передать. Или я ошибаюсь?
N>например int connect( char * host );
N>у меня есть Str host, который может только в const char* кастить. Использовать const_cast не хочется.
N>Могу я что-то сделать со string?
Хак, основанный на предположении, что строка хранится сплошняком: &(str[0])
Стандарт не требует, чтобы элементы строки хранились подряд (функция c_str() может синтезировать массив на лету), но вроде бы все реализации — сплошные.
Здравствуйте, Nickolas, Вы писали:
N>auto_ptr<char> host(new char[conf.hostAddress.length()+1]); N>strncpy(&(*host), conf.hostAddress, conf.hostAddress.length());
Так нельзя делать. auto_ptr не предназначен для работы с массивами.
N>и если так можно — то нельзя как-нить покрасивше?
Для массивов есть boost::scoped_array
А в твоём случае, как посоветовал Batiskaf, лучше всего применить std::string или std::vector<char>
Здравствуйте, Кодт, Вы писали:
К>Хак, основанный на предположении, что строка хранится сплошняком: &(str[0]) К>Стандарт не требует, чтобы элементы строки хранились подряд (функция c_str() может синтезировать массив на лету), но вроде бы все реализации — сплошные.
Про ф-цию c_str() надо говорить в начале ответа. А потом мелким шрифтом написать про хак &(str[0])
И вообще, если стандарт не гарантирует что-то, то подобных решений лучше не предлагать.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, Кодт, Вы писали:
К>>Хак, основанный на предположении, что строка хранится сплошняком: &(str[0]) К>>Стандарт не требует, чтобы элементы строки хранились подряд (функция c_str() может синтезировать массив на лету), но вроде бы все реализации — сплошные.
AD>Про ф-цию c_str() надо говорить в начале ответа. А потом мелким шрифтом написать про хак &(str[0])
AD>И вообще, если стандарт не гарантирует что-то, то подобных решений лучше не предлагать.