Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Проблема с типами в C++
 
Здраствуйте!

У меня небольшая проблема с конвертацией типов, а именно не могу преобразовать char в string. Не нашел функции, кот позволяют это делать!
 
char или char[]?
 
Да, массив чаров char[]. Я прочитал строку potok.getline(char[],128); А теперь мне надо преобразовать этот массив char[] в string. Пробовал писать String(char[]) - ругается, еще пробовал пару способов, но тоже не получается. Все это я пишу в Microsoft Visual C++.
 
Ну и как ты себе представляешь это преобразование?=)
Это типа новая модная шутка, да?=)
В визуал с++ такое преобразование является Расширяющим .Впринципе, расширяющие преобразования никогда не вызывают переполнение, но могут привести к потере точности, так что хорошо подумай: либо ты перепишешь пару строк кода, либо твой код будет не совсем стабильным=)
Но если ты уж так хочешь, то я могу предложить способ, который я использовал на практике. Он заключается в использовании Конструктора. Но нам нужно будет перегружать функцию. Пример определяет рудиментарный класс строк, допускающих конкатенацию с помощью знака сложения.

///////////////////////////////////////


#pragma hdrstop

#include <condefs.h>

#include <string.h>

#include <stdio.h>

class String {

char *str; // Указатель на динамическую строку.

int len; // Длина строки.

String(int); // Вспомогательный конструктор. public:

String(const Strings); // Конструктор копии.

String(const char*); // Конструктор преобразования.

~String () ;

String Soperator=(const Strings);

String operators- (const Strings);

friend String operator+(const Strings, const Strings);

void Show () ;

};

String::String(int size)

{

len = size;

str = new char[len + 1]; // +1 байт для завершающего 0.

}

String::String(const String ssrc)

{

len = src.len;

str = new char[len + 1];

strcpy(str, src.str);

}

String::String(const char *s)

{

len = strlen(s) ;

str = new char[len + 1];

strcpy(str, s);

String::~String()

{

delete [] str;

/////////////////////////////////////////

// Операция присваивания.

//

String SString::operator=(const String &op)

{

delete [] str; // Удаление старых данных.

len = op.len;

str = new char[len + 1]; // Выделение новой строки.

strcpy(str, op.str);

return *this;

}

///////////////////////////////////////////

// Функция-элемент operator+0.

//

String String::operators- (const String &op)

{

String temp(len + op.len); // Временный объект.

strcpy(temp.str, str); // Копирование первой строки.

strcat(temp.str, op.str); // Присоединение второй строки.

return temp;

}

////////////////////////////////////////////

// Дружественная функция operator+() Аналогична предыдущей,

// но допускает С-строку в качестве первого операнда.

//

String operator+(const String Sfop, const String &sop)

{

String temp(fop.len + sop.len);

strcpy(temp.str, fop.str);

strcat(temp.str, sop.str);

return temp;

}

void String::Show()

{

printf("%s: %d \n", str, len);

}

irit main()

{

char cStr[] °= "This is а С string! ";

String rirst = "First String string. ;

String second = "Second String string. ";

String resStr = "";

resStr.Show() ;

resStr = first + second; // Вызывает операцию класса.

resStr.:Shp,w ();

resStr = cStr + resStr; // Вызывает дружественную

// операцию reeStr.Show()

resStr = first + second + cStr; // Обе операции - из

// класса. resStr.Show () ;

return 0;

}

Поскольку имеется конструктор преобразования char* в String, компилятор автоматически приводит первый операнд к типу String, создавая на стеке временный объект, и затем выполняет сложение с помощью дружественной функции.=)
Тут немного лишнее есть, но я так сделал чтобы тебе принцип понятен был=). Если это усвоишь, значит я думаю, вопросов о преобразовании вообще не будет... Тока смотри доки по типам, .тк. вообще-то не следует так делать=)
Надеюсь, ты меня понял.....
 
Спасибо большое...
Тут возник еще вопрос, как мне можно вытащить один символ, для того чтобы сделать strcat(tst,tfn1[ti]); проблема еще в том что char tfn1[200] и tf.getline(tfn1,200); а с указателем работает либо то, либо другое. Пробовал через смещение внутри адреса, но не получается
 
Спасибо еще раз за совет, но я нашел еще более простое решение проблемы преобразования типов:
char tfn1[200];

string StrTemp;
StrTemp=(string)tfn1;

А вопрос по поводу того как вытащить один символ из выше приведенной ситуации, меня еще интересует =)
Страницы: 1
Читают тему (гостей: 1)