Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оператор присваивания

5.9K
28 февраля 2005 года
vladlenn
32 / / 17.02.2005
Мне нужно определить для своего класса оператор присваивания класс описан так:


struct RAST{
RAST *left,*right;
int ver1,ver2;
double rast,ang;
bool sellected;
};
struct DOT{
DOT *left,*right;
int ver,ind;
double x,y;
bool sellected;
};
class TREE{
public:

DOT *Find(int i);

RAST *vetv;
DOT *dot;

TREE();
~TREE();
bool AddDot(int ver,double x,double y);
bool AddVetv(int ver1,int ver2);
double Length();
DOT *__fastcall SelDotXY(int x, int y);
*************Другие методы***********
RAST * __fastcall AddVetv(DOT *d1,DOT *d2)

TREE &operator = (TREE &G);

};

Затем описываю оператор:
TREE &TREE:perator=(TREE &G)
{
if (this->dot->ver != 0) this->ClearTree();
DOT *d;
d=G->dot;
d->
while(d!=NULL)
{
this->AddDot(d->ver,d->x,d->y);
d=d->right;
}
RAST *v;
v=G->vetv;
while(v!=NULL)
{
this->AddVetv(v->ver1,v->ver2);
v=v->right;
}
return *this;
}

А он ругается:
[C++ Error] UnitTree.cpp(584): E2206 Illegal character 'а' (0xa0)
[C++ Error] UnitTree.cpp(586): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] UnitTree.cpp(58: E2280 Member identifier expected
[C++ Error] UnitTree.cpp(594): E2451 Undefined symbol 'v'
[C++ Error] UnitTree.cpp(594): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] UnitTree.cpp(600): E2206 Illegal character 'а' (0xa0)

Скажите что ему нужно???

Сообщить модератору | IP: Logged
259
28 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by vladlenn
Мне нужно определить для своего класса оператор присваивания класс описан так:


struct RAST{
RAST *left,*right;
int ver1,ver2;
double rast,ang;
bool sellected;
};
struct DOT{
DOT *left,*right;
int ver,ind;
double x,y;
bool sellected;
};
class TREE{
public:

DOT *Find(int i);

RAST *vetv;
DOT *dot;

TREE();
~TREE();
bool AddDot(int ver,double x,double y);
bool AddVetv(int ver1,int ver2);
double Length();
DOT *__fastcall SelDotXY(int x, int y);
*************Другие методы***********
RAST * __fastcall AddVetv(DOT *d1,DOT *d2)

TREE &operator = (TREE &G);

};

Затем описываю оператор:
TREE &TREE:perator=(TREE &G)
{
if (this->dot->ver != 0) this->ClearTree();
DOT *d;
d=G->dot;
d->
while(d!=NULL)
{
this->AddDot(d->ver,d->x,d->y);
d=d->right;
}
RAST *v;
v=G->vetv;
while(v!=NULL)
{
this->AddVetv(v->ver1,v->ver2);
v=v->right;
}
return *this;
}

А он ругается:
[C++ Error] UnitTree.cpp(584): E2206 Illegal character 'а' (0xa0)
[C++ Error] UnitTree.cpp(586): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] UnitTree.cpp(58: E2280 Member identifier expected
[C++ Error] UnitTree.cpp(594): E2451 Undefined symbol 'v'
[C++ Error] UnitTree.cpp(594): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] UnitTree.cpp(600): E2206 Illegal character 'а' (0xa0)

Скажите что ему нужно???

Сообщить модератору | IP: Logged


Вы определили оператор присваивания дерева дереву. А не элементов класса, элементу класса. И ввобще судя по примеру он здесь излишен.

5.9K
28 февраля 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by AlexandrVSmirno

Вы определили [COLOR=red]оператор присваивания дерева дереву.[/COLOR] А не элементов класса, элементу класса. И ввобще судя по примеру он здесь излишен.



Тогда, Вприложении есть два дерева, мне нужно чтоб
в момент Х дерево1 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????

259
28 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by vladlenn


Тогда, Вприложении есть два дерева, мне нужно чтоб
в момент Х дерево1 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????


Да нет конечно - же класса. Напишите, пожалуйста, пример почетче. Он с ошибками. Понять, что либо трудно. Чтобы все это выглядело более читабельно возьмите его в тэг

 
Код:
Текст примера
5.9K
28 февраля 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by AlexandrVSmirno

Да нет конечно - же класса. Напишите, пожалуйста, пример почетче. Он с ошибками. Понять, что либо трудно. Чтобы все это выглядело более читабельно возьмите его в тэг
 
Код:
Текст примера


Описание класса и используемых в нем типов

Код:
struct RAST{
           RAST *left,*right;
           int ver1,ver2;
           double rast,ang;
public:
        bool sellected;
           };
struct DOT{
           DOT *left,*right;
           int ver,ind;
           double x,y;
public:
        bool sellected;
           };
class TREE{
public:

        DOT *Find(int i);

        RAST *vetv;
        DOT *dot;

        TREE();
        ~TREE();
        bool AddDot(int ver,double x,double y);
        bool AddVetv(int ver1,int ver2);
        double Length();
        DOT *__fastcall SelDotXY(int x, int y);
        RAST * __fastcall AddVetv(DOT *d1,DOT *d2);
        DOT *__fastcall DelVer(DOT * p);
        RAST *__fastcall DelVetv(RAST *p);
        void __fastcall DeSel();
        void __fastcall MoveSelDots(char tx,char ty);
        void __fastcall SaveToFile(char * file,bool t);
        bool __fastcall OpenFromFile(char * file, bool t);
        void __fastcall ClearTree();

        TREE &operator = (TREE &G);
};


А это реализация оператора функции AddDot() и AddVetv() - добавляют в dot или vetv элемент
вполне коректно (вроде скоко проверял все нормально)
Код:
TREE &TREE::operator=(TREE &G)
{
        if(this->dot->ver!=0)this->ClearTree();
        DOT *d;
        d=G->dot;
        d->
        while(d!=NULL)
        {
                this->AddDot(d->ver,d->x,d->y);
                d=d->right;
        }
        RAST *v;
        v=G->vetv;
        while(v!=NULL)
        {
                this->AddVetv(v->ver1,v->ver2);
                v=v->right;
        }
        return *this;
}
259
28 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by vladlenn

Описание класса и используемых в нем типов
Код:
struct RAST{
           RAST *left,*right;
           int ver1,ver2;
           double rast,ang;
public:
        bool sellected;
           };
struct DOT{
           DOT *left,*right;
           int ver,ind;
           double x,y;
public:
        bool sellected;
           };
class TREE{
public:

        DOT *Find(int i);

        RAST *vetv;
        DOT *dot;

        TREE();
        ~TREE();
        bool AddDot(int ver,double x,double y);
        bool AddVetv(int ver1,int ver2);
        double Length();
        DOT *__fastcall SelDotXY(int x, int y);
        RAST * __fastcall AddVetv(DOT *d1,DOT *d2);
        DOT *__fastcall DelVer(DOT * p);
        RAST *__fastcall DelVetv(RAST *p);
        void __fastcall DeSel();
        void __fastcall MoveSelDots(char tx,char ty);
        void __fastcall SaveToFile(char * file,bool t);
        bool __fastcall OpenFromFile(char * file, bool t);
        void __fastcall ClearTree();

        TREE &operator = (TREE &G);
};


А это реализация оператора функции AddDot() и AddVetv() - добавляют в dot или vetv элемент
вполне коректно (вроде скоко проверял все нормально)
Код:
[COLOR=red]TREE&[/COLOR] TREE::operator=(TREE &G)
{
        if(this->dot->ver!=0)this->ClearTree();
        DOT *d;
[COLOR=red]        d=G.dot;[/COLOR]
        d-> [COLOR=red]//Это вообще не очень понятно что?
//И похоже крыша у компилятора едет по полной программе и все ошибки дале наведенные[/COLOR]
        while(d!=NULL)
        {
                this->AddDot(d->ver,d->x,d->y);
                d=d->right;
        }
        RAST *v;
[COLOR=red]        v=G.vetv;[/COLOR]
        while(v!=NULL)
        {
                this->AddVetv(v->ver1,v->ver2);
                v=v->right;
        }
        return *this;
}

5.9K
28 февраля 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by AlexandrVSmirno


В чем разница между d.dot и d->dot ???
Насчет "d->" " это когда я в месаге ошибся.

Компилятор ругается на
if(this->dot->ver!=0)this->ClearTree();

259
28 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by vladlenn

В чем разница между d.dot и d->dot ???
Насчет "d->" " это когда я в месаге ошибся.

Компилятор ругается на
if(this->dot->ver!=0)this->ClearTree();



1.Если переменная определяется как указатель, то используется оперетар ссылки (TREE* a; a->dot), если как значение или ссылка используется точка (TREE a; a.dot; TREE& a; a.dot).

2. На вид вроде все правильно, но я не уведел описание ClearTree();

5.9K
01 марта 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by AlexandrVSmirno


1.Если переменная определяется как указатель, то используется оперетар ссылки (TREE* a; a->dot), если как значение или ссылка используется точка (TREE a; a.dot; TREE& a; a.dot).

2. На вид вроде все правильно, но я не уведел описание ClearTree();



ClearTree()-это метод очистки дерева, тотесть прежде чем чтото положить в дерево мы его опустошаем

Код:
void __fastcall TREE::ClearTree()
{

   if(dot->ver!=0)
   {
     while (dot->right!=NULL)
      {
        dot=dot->right;
        delete dot->left;
      }
      dot->left=NULL;
      dot->ver=0;
          dot->sellected=0;
   }
   if(vetv->rast!=0){
     while(vetv->right!=NULL)
      {
        vetv=vetv->right;
        delete vetv->left;
      }
    vetv->left=NULL;
    vetv->rast=0;
        vetv->ver1=0;
        vetv->sellected=0;
   }
   return ;
}


Я слышал про какой-то еще конструктор копирования может так???
259
01 марта 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by vladlenn


ClearTree()-это метод очистки дерева, тотесть прежде чем чтото положить в дерево мы его опустошаем
Код:
void __fastcall TREE::ClearTree()
{

   if(dot->ver!=0)
   {
     while (dot->right!=NULL)
      {
        dot=dot->right;
        delete dot->left;
      }
      dot->left=NULL;
      dot->ver=0;
          dot->sellected=0;
   }
   if(vetv->rast!=0){
     while(vetv->right!=NULL)
      {
        vetv=vetv->right;
        delete vetv->left;
      }
    vetv->left=NULL;
    vetv->rast=0;
        vetv->ver1=0;
        vetv->sellected=0;
   }
   return ;
}


Я слышал про какой-то еще конструктор копирования может так???


Ну вобщем - то я никакой крамолы не заметил. Может где случайно русские буквы вместо аглицких проскочили?. Попробуй все аккуратно перенабрать. Про конструктор я ничего не слышал.

1
02 марта 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by vladlenn


Тогда, Вприложении есть два дерева, мне нужно чтоб
в момент Х дерево1 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????


ИМХО подобные операции над такими сущностями, как правило лучше реализовать дружественной фукцией типа свап или подобной - а явного присваивания избегать.

5.9K
02 марта 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by kot_

ИМХО подобные операции над такими сущностями, как правило лучше реализовать дружественной фукцией типа свап или подобной - а явного присваивания избегать.



Почему???


А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу


И ещё что значит - ИМХО???

1
02 марта 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by vladlenn


Почему???


А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу


И ещё что значит - ИМХО???


Не - не печатных символов вроде нет - прада не понятно - такие же и стоко же ...:) - так всеже символы были или нет? Может отсутствовал символ перевода каретки.
IMHO - английская абревиатура, в русском эквиваленте - "По моему скромному мнению" - почему избегать? А какой смысл в ее использовании? Вполне четко можно определить присваивание для RAST например. Для TREE я лично не вижу необходимости в подобном операторе. Во первых, я бы не гарантировал, его корректное использование, во вторых - логический смысл - это очистка и заполнение массива - где же здесь присваивание? в третьих - это практически не контролируемые утечки памяти ну и так далее - высокая температура и грипп не способствуют мышлению...X)-
Первый и второй аргумент следует поменять местами - первый вытекает из второго...:)
Ну надеюсь что в общем моя мысль понятна.

487
03 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by vladlenn


Почему???


А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу


И ещё что значит - ИМХО???



Word - это текстовый процессор - а BCB - все-таки среда разработки и ей такой функционал не нужен. Ответ очень прост: судя по всему кто-то ручками копался в исходнике - при помощи Far или Dos Navigator, к примеру. И в DOS-кодировке стандартной 866 влепил в конец строки русскую букву 'а' - ее код кстати 0xA0. А в шрифтах, которые по умолчанию использует винда (в том числе и BCB) используется кодировка Windows 1251 - и русские символы там имеют совсем другие коды - если быть точнее: по порядку от 0xC0 до 0xFF. А на кодах от 0x80 до 0xC0 болтаются символы псевдографики. Так вот, в большинстве шрифтов код 0xA0 не имеет символьного представления - посему становится "невидимым". И к непечатным сиволам он не имеет ни малейшего отношения. Непечатные символы - это символы в диапазоне от 0x0 до 0x20.

5.9K
03 марта 2005 года
vladlenn
32 / / 17.02.2005
Цитата:
Originally posted by kot_
[COLOR=red] ....Первый и второй аргумент следует поменять местами - первый вытекает из второго...[/COLOR]



Не совсем понял о каких ты аргументах

Цитата:
Originally posted by kot_

высокая температура и грипп не способствуют мышлению...



Ты не болей, витамины пей!!!!!!!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог