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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите пожалуйста проблема с перегрузкой операто 
:(
    Опции темы
4aineG
Дата 10.8.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите пожалуйста проблема с перегрузкой операторов >> <<, возможно и с '-' и еще с конструктором без параметров наверно проблема 
#pragma once
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class Line
{
private:

    char *Line1; 
    int length;

public:

    Line()
    {
        Line1 [length] = '\0';
    }

    Line(char* L1)
    {
        Line1 = new char[strlen(L1)];
        strcpy(Line1, L1);
        length = strlen(Line1);
    }

//    friend ostream& operator << (ostream& out, Line& lin);
   // friend istream & operator >> (istream & in, Line &lin);
//    Line operator - (char letter);

    int CountWordsInLine()
    {
        int Count=0;
        for(int i=0; i<length; i++)
    {
        if (Line1[i]=='_')
            Count++;
    }
        Count++;
        return Count;
    }

    char* ReverseLine() 
    { 
        for (int i=0; i<=(length-1)/2; i++)
    {
        char temp = Line1[i];
        Line1[i] = Line1[length-i-1];
        Line1[length-i-1] = temp;
    }
        return Line1;
    }

    void Print()
    {
        cout << Line1 << endl;
    }

    Line operator - (char letter)
    {
        char *temp = new char[length];
        for (int i=0; i<length; i++)
    {
        if (Line1[i]!= letter)
            temp[i] = Line1[i];
        temp[i]='\0';
    }
        strcpy(Line1, temp);
        for (int i=0; i<length; i++)
            delete [] temp;
        return Line1;
}

    istream & operator >> (istream & in)
    { 
        in >> Line1 >> endl;
        return in;
    }

    ostream& operator << (ostream& out)
    {
        out << Line1;
        return out;
    }
};


#pragma once
#include "Class.h"

int main()
{
    Line ln1("Hello_Russia");
    cout << "normal sentece: ";
    Line ln2;
    cin >> ln2 >> endl;
    Line lin = ln2 - 'l';
    cout << "without delete letters: " << lin;

    Line lnx1 = ln1.CountWordsInLine();
    cout << "number of words: ";
    lnx1.Print();

    Line lnx2 = ln1.ReverseLine();
    cout << "reversed sentence: ";
    lnx2.Print();

    return 0;
}

PM MAIL   Вверх
cutwater
Дата 10.8.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пока то что скажу на вскидку посмотрев код.
В конструкторе по умолчанию не выделяется динамическая память поэтому куда вы нуль завершитель присваиваете неизвестно. либо присвойте
Код

Line = NULL;
length = 0;

либо выделяйте память.
Нет деструктора, память за вас очищать тоже никто не будет.

Это сообщение отредактировал(а) cutwater - 10.8.2008, 19:56


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 10.8.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В конструкторе с параметром вы совершаете 2 ошибки.
1) 2 раза используете ф-цию strlen, которая проверяет всю строку на наличие нульзавершителя и на больших строках злоупотребление скажется на производительности
2) strlen возвращает длину строки без учета нуль завершителя

правильно так
Код

    Line(char* L1)
    {
        length = strlen(Line1);
        Line1 = new char[length + 1];
        strcpy(Line1, L1);
    }


Reverce line тоже не есть правильно, по идее нужно брать цикл до length / 2 в вашем случае и ни в коем случае нельзя возвращать указатель - поле класса. Ибо это нарушает инкапсуляцию..

и вообще проблема у вас в каждой второй строке. укажите конкретно что не так, тогда дальше будем смотреть.

Это сообщение отредактировал(а) cutwater - 10.8.2008, 20:00


--------------------
user posted image
PM MAIL   Вверх
IKM2007
Дата 11.8.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



4aineG,
1.Перегруженные операции поместить в поток и взять из потока должны обьявляться как дружественные.
2.К чему тебе понадобилось fstream?
3.Ты не можешь написать такое in >> Line1 >> endl; это то же самое, что написать cin>>a>>endl;
4.если используешь strcpy(),strlen(), и т.д. , то это библиотека cstring, а не string
5.не правильно реализован operator- 
и т.д. smile 
вот поправил
Код

#include <iostream>
#include <cstring>
using namespace std;
class Line
{
friend istream & operator >> (istream &,Line &);
friend ostream & operator << (ostream &,Line &);
private:
    char *Line1; 
    int length;
public:
    Line();
    Line(const char* );
    ~Line();
    int CountWordsInLine()const;
    void Print()const;
    void ReverseLine();
    Line operator - (char letter);
};
Line::Line()
{length=1;
Line1=new char(length);
Line1[0]='\0';
}
Line::Line(const char *a)
{
length=strlen(a)+1;
Line1=new char[length];
strcpy(Line1,a);
Line1[length-1]='\0';
}
Line::~Line()
{
delete [] Line1;
}
int Line::CountWordsInLine()const
    {
        int Count=0;
        for(int i=0; i<length-1; i++)
    {
        if (Line1[i]=='_')
            Count++;
    }
        Count++;
        return Count;
    }
void Line::Print()const
    {
        cout << Line1 << endl;
    }
void Line::ReverseLine()
    { char temp;
        for (int i=0; i<(length-1)/2; i++)
    {
        char temp = Line1[i];
        Line1[i] = Line1[length-i-2];
        Line1[length-i-2] = temp;
    }
    }
Line Line::operator - (char letter)
    {
        char *temp = new char[length];
        int i,j;
        for (i=0,j=0; i<length-1;i++)
    {
        if (Line1[i]!= letter)
        { temp[j] = Line1[i];
        j++;}
        
    }
        temp[j]='\0';
        return Line(temp);
}
istream & operator >> (istream & in,Line &x)
    { char a[100];
       in>>a;
       x.length=strlen(a)+1;
       x.Line1=new char[x.length];
       strcpy(x.Line1,a);
       return in;
    }
ostream& operator << (ostream& out,Line &x)
    {
       return  out << x.Line1;
    }
int main()
{
Line a("sf");
cin>>a;
cout<<a<<endl;
a.ReverseLine();
cout<<a<<endl;
a.ReverseLine();
cout<<a<<endl;
a.Print();
cout<<a.CountWordsInLine()<<endl;
cout<<a-'a'<<endl;
return 0;
}

P.S. используй кнопку КОД


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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