Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка не работает / 7 сообщений из 7, страница 1 из 1
20.09.2006, 22:52
    #34001531
The_answer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
Суть задачи скопировать одну строку в другую через перегрузку" =", чтобы в новой строке не было ни одной скобки из первой.
НЕ пашет, а почему?
#include "iostream.h"
#include "conio.h"
#include "alloc.h"
#include "stdlib.h"
#include <stdio.h>
#include <string.h>

class String {


char *str;
int size;

public:
String();
~String();
String& operator=(const String&);
void set();
void print();
};
//////////////////////////////////////////////////////////////////////////////////
String::String() {
str=NULL;
size=0;
}
//////////////////////////////////////////////////////////////////////////////////
String::~String() {
delete str;
};
//////////////////////////////////////////////////////////////////////////////////
void String::set()
{ char *s = "\0";
cout<<"Vvedite stroku"<<endl;
gets(s);
str = new char [strlen(s)+1];
strcpy(str,s);
} ;
//////////////////////////////////////////////////////////////////////////////////
void String:: print()
{
cout<<str<<endl;
};
/////////////////////////////////////////////////////////////////////
String& String::operator=(const String& a)
{ int i,j=0;
for (i=0;i=strlen(str);i++)
{
if (a.str !=')')
{str[j]=a.str;
j=j+1;
}

}
return *this;
}
/////////////////////////////////////////////////////////////////////
void main(void)
{
String *s1;
String *s2;
s1->set();
s2=s1;
s2->print();
getch();}
...
Рейтинг: 0 / 0
21.09.2006, 09:39
    #34001905
AsPiro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
The_answer
...
Код: plaintext
1.
2.
3.
4.
5.
//////////////////////////////////////////////////////////////////////////////////
String::String() {
     str=NULL; // Сюда внимательно смотрим!
     size= 0 ;
			  }
//////////////////////////////////////////////////////////////////////////////////
...


После чего думаем в слеующем направлении - вот мы захотели скопировать строку, вот у нас для создания копии вызвался конструктор, вот он присвоил str=NULL;
The_answer
...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
/////////////////////////////////////////////////////////////////////
String& String::operator=(const String& a)
{  
int i,j= 0 ;
for (i= 0 ;i=strlen(str);i++)
    {
    if (a.str[i]!=')')
        {
        str[j]=a.str[i]; // ... и вот наконец присваивание.
                            // Внимание вопрос: куда у нас указывает str[j]?
        j=j+ 1 ;
       }
    }
return *this;
}
/////////////////////////////////////////////////////////////////////

...

Короче... память под копию строки выделять будем или "и так сойдёт!"???
...
Рейтинг: 0 / 0
21.09.2006, 10:27
    #34002066
Перегрузка не работает
AsPiro
The_answer
...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
/////////////////////////////////////////////////////////////////////
String& String::operator=(const String& a)
{  
int i,j= 0 ;
for (i= 0 ;i=strlen(str);i++)
    {
    if (a.str[i]!=')')
        {
        str[j]=a.str[i]; // ... и вот наконец присваивание.
                            // Внимание вопрос: куда у нас указывает str[j]?
        j=j+ 1 ;
       }
    }
return *this;
}
/////////////////////////////////////////////////////////////////////

...

Короче... память под копию строки выделять будем или "и так сойдёт!"???

И еще в догонку:
2 The_answer: никак не могу понять, что и как будет делать цикл for в таком написании... (Идея правильная, но реализация оставляет желать лучшего...)

По-моему, здесь очень легко получить "фэйсом об тайбл": как только встретится скобка ( ')' ), так и произойдет зацикливание - ибо вторым параметром в for идет не сравнение, а присваивание...

ИМХО, более правильный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/////////////////////////////////////////////////////////////////////
String& String::operator=(const String& a)
{  
int i,j= 0 ;
for (i= 0 ;i<strlen(a.str);i++)
    {
    if ((a.str[i]!=')')||(a.str[i]!='(')) //Т.к. скобки могут быть не только закрывающими
        {
        str[j]=a.str[i]; 
        j++;
       }
    }
return *this;
}
/////////////////////////////////////////////////////////////////////

...
...
Рейтинг: 0 / 0
23.09.2006, 22:53
    #34008022
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
Начнем с того, что gets-e нужен для ввода реальный буфер для данных, а не
указатель на константу. Это вообще к защите памяти приведет на некоторых системах.

Код: plaintext
1.
2.
3.
4.
char *s = "\0";
cout<<"Vvedite stroku"<<endl;
gets(s);

...
Рейтинг: 0 / 0
23.09.2006, 22:58
    #34008023
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
Да, цыкл зачетный, парадавал

for (i=0;i=strlen(str);i++)
{
if (a.str!=')')
{str[j]=a.str;
j=j+1;
}

Да и вообще бред все. Полный. На всех уровнях. Рекомендую выбросить все и написать правильно.
...
Рейтинг: 0 / 0
24.09.2006, 00:30
    #34008067
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
MasterZivДа, цыкл зачетный, парадавал В плане нечитаемости программы - очень даже неплохие идеи есть :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
24.09.2006, 06:33
    #34008121
dudochkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка не работает
MasterZiv

Код: plaintext
1.
2.
3.
4.
char *s = "\0";
cout<<"Vvedite stroku"<<endl;
gets(s);


Без мазы.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка не работает / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]