Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Методы ввода и перегрузка операций


Автор: BeloFF 20.6.2010, 18:41
Общая   постановка.   Пользовательский   класс   String   должен   содержать 
необходимые элементы­данные, которые создаются в динамической области 
памяти.
• Конструктор для создания строк:String (…);
• Деструктор:~String(); 
• Метод ввода исходной строки: Set();
• Метод печати:void print(…);
Код методов  – вне пространства определения класса
Программа иллюстрирует прямой и косвенный способы обращения к методам.

Ввести с клавиатуры строку   символов S1. Признак окончания ввода 
строки   ­   нажатие   клавиши   "Ввод".   Программа   должна   содержать 
перегруженную операцию «=», использование которой скопирует S1 в S2 при 
следующих условиях:
- подстроку до последнего пробела (То есть получается необходимо выбросить последнее введенное слово, остальное скопировать)

PS Задание очень схоже с заданием, решенным в http://forum.vingrad.ru/forum/topic-182332/unread-1/anchor-entry2170269/0.html теме. Однако самостоятельно изменить его не могу.

Цитата

#include <iostream>
#include <cstring>
using namespace std;

////////////////// class //////////////////////////////////////////
class String{
private:
// ... элементы-данные создаются в динамической области памяти.
    char *m_pszStr; // указатель на строку с нулём на коце
    int *m_pnSize; // указатель на размер строки

    void New( const char *str ); // выделение памяти
    void Del(); // удаление памяти

public:
    String(); // конструктор по умолчанию
    explicit String(const String &str); // конструктор копирования
    String( const char * str ); // дополнительный конструктор
    ~String(); // деструктор

    void Set();
    void Print();
    String & operator=( const String & str );
};
///////////////////// function ///////////////////////////////////
const char g_cszDel[] = "qwertyuiopasdfghjklzxcvbnm"; // строка латинских букв

void String::New( const char *str ){
    int size = strlen(str);
    m_pszStr = new char[size+1]; // массив для строки символов
    m_pnSize = new int(size); // длинна строки
    strcpy( m_pszStr, str ); // копируем строку
}
void String::Del(){
    delete [] m_pszStr;
    delete m_pnSize;
}

String::String(){ New("\0"); }
String::String(const char *str){ New(str); }
String::String(const String &str){ New(str.m_pszStr); }
String::~String(){ Del(); }

void String::Print(){ std::cout << m_pszStr << '\n'; }
void String::Set(){
    Del();
    char tmp[1000];
    cin.getline( tmp, 1000 );
    cin.sync();
    New(tmp); 
}


String & String::operator =(const String &str){
    if( this == &str ) return *this; // если присваиваем самого себя
    Del();
    char *tmp = new char[*str.m_pnSize+1];
    char *pt =tmp, *beg;
    // копируем строку
    for( beg=str.m_pszStr; *beg; ++beg )
        if(!strchr(g_cszDel, *beg)){
            *pt = *beg;
            pt++;
        }
    *pt = '\0';
    New(tmp);
    delete [] tmp;
    return *this;
}

//////////////////// Main ////////////////////////////////////////
int main(){
    String str, str2;
    str.Set();
    str2 = str; // копируем без маленьких латинских букв
    str2.Print();


    getchar(); // пауза
    return 0;
}

Автор: vnf 21.6.2010, 21:01
Код

#include <iostream>

class String
{
private:
    char * strz; // указатель на буфер с нулём на конце
public:
    String(); // конструктор по умолчанию
    explicit String(const String &str); // конструктор копирования
    String( const char * str ); // дополнительный конструктор
    ~String(); // деструктор

    char * getstrz() const;
    void Set( const char * str );
    void print();
    String & operator=( const String & str );
};

String::String():strz(NULL){ Set(""); }

String::String(const char *str):strz(NULL){ Set(str); }

String::String(const String &str):strz(NULL){ Set(str.getstrz()); }

String::~String(){delete [] strz;}

char * String::getstrz()const { return strz; }

void String::print(){ std::cout << strz << '\n'; }

void String::Set( const char *str )
{
    delete [] strz;
    strz = new char[strlen(str)+1]; // массив для строки символов
    strcpy( strz, str );            // копируем строку
}

String & String::operator =(const String &str)
{
    //ищем последний пробел
    char * buff = str.getstrz();
    int i = strlen(buff);
    for(; i>=0; --i)
    {
        if(buff[i]==' ')
            break;
    }
    char * tmp(NULL);
    tmp = new char[i+1];
    memcpy(tmp, buff, i);
    tmp[i]= '\0';
    Set(tmp);
    delete [] tmp;
    return *this;
}

//////////////////// Main ////////////////////////////////////////
int main(int argc, char* argv[])
{
    char tmp[1000];
    std::cin.getline( tmp, 1000 );
    String str;
    str.Set(tmp);

    String * str2 = new String;
    *str2 = str; 
    str2->print();

    getchar(); // пауза
    return 0;
}


Автор: BeloFF 22.6.2010, 09:59
vnf, спасибо.. но у меня 6 ошибок выдает в твоей программе, в то время, как в оригинале компилируется все без ошибок. Проверите?

Автор: BeloFF 23.6.2010, 13:19
Неужели никто не может помочь

Автор: ИванМ 23.6.2010, 14:42
BeloFF, напиши, какие конкретно ошибки и в каких строчках.

Автор: BeloFF 24.6.2010, 14:33
Цитата

d:\0\îîï\frame\kr1.cpp(48) : error C2059: syntax error : 'constant'
d:\0\îîï\frame\kr1.cpp(49) : error C2659: '=' : overloaded function as left operand
d:\0\îîï\frame\kr1.cpp(51) : error C2109: subscript requires array or pointer type
d:\0\îîï\frame\kr1.cpp(51) : error C2106: '=' : left operand must be l-value
d:\0\îîï\frame\kr1.cpp(51) : warning C4550: expression evaluates to a function which is missing an argument list
d:\0\îîï\frame\kr1.cpp(52) : error C2664: 'Set' : cannot convert parameter 1 from 'char *(__cdecl *)(void)' to 'const char *'
        There is no context in which this conversion is possible
d:\0\îîï\frame\kr1.cpp(53) : error C2541: delete : cannot delete objects that are not pointers
Error executing cl.exe.

kr1.obj - 6 error(s), 1 warning(s)


Все ошибки во второй части фрагмента после for
Цитата

String & String::operator =(const String &str)
{
    //èùåì ïîñëåäíèé ïðîáåë
    char * buff = str.getstrz();
    int i = strlen(buff);
    for(; i>=0; --i)
    {
        if(buff[i]==' ')
            break;
    }
    char * tmp(NULL);
    tmp = new char[i+1];
    memcpy(tmp, buff, i);
    tmp[i]= '\0';
    Set(tmp);
    delete [] tmp;
    return *this;
}

Автор: ИванМ 24.6.2010, 21:59
BeloFF, ошибок не вижу. Попробуй сделать clean project.

Автор: BeloFF 25.6.2010, 07:10
ИванМ, т.е. у тя все компилируется? У меня моя первая цитата без ошибок. Все последующие - выдает такие 6 строчкек с ошибками..

Автор: ИванМ 27.6.2010, 21:59
BeloFF, я не запускал. На глаз.

Автор: vnf 29.6.2010, 20:05
чем компилируешь? Я делал на VS2005

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)