Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Методы ввода и перегрузка операций, изменить программу 
:(
    Опции темы
BeloFF
Дата 20.6.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



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

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

PS Задание очень схоже с заданием, решенным в этой теме. Однако самостоятельно изменить его не могу.

Цитата

#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;
}

PM MAIL   Вверх
vnf
Дата 21.6.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Код

#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;
}


PM MAIL   Вверх
BeloFF
Дата 22.6.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



vnf, спасибо.. но у меня 6 ошибок выдает в твоей программе, в то время, как в оригинале компилируется все без ошибок. Проверите?
PM MAIL   Вверх
BeloFF
Дата 23.6.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Неужели никто не может помочь
PM MAIL   Вверх
ИванМ
Дата 23.6.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 13
Всего: 23



BeloFF, напиши, какие конкретно ошибки и в каких строчках.
PM MAIL   Вверх
BeloFF
Дата 24.6.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Цитата

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;
}

PM MAIL   Вверх
ИванМ
Дата 24.6.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 13
Всего: 23



BeloFF, ошибок не вижу. Попробуй сделать clean project.
PM MAIL   Вверх
BeloFF
Дата 25.6.2010, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



ИванМ, т.е. у тя все компилируется? У меня моя первая цитата без ошибок. Все последующие - выдает такие 6 строчкек с ошибками..
PM MAIL   Вверх
ИванМ
Дата 27.6.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 13
Всего: 23



BeloFF, я не запускал. На глаз.
PM MAIL   Вверх
vnf
Дата 29.6.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



чем компилируешь? Я делал на VS2005
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.