Оператор присваивания
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
Мне нужно определить для своего класса оператор присваивания класс описан так:
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
Вы определили оператор присваивания дерева дереву. А не элементов класса, элементу класса. И ввобще судя по примеру он здесь излишен.
Вы определили [COLOR=red]оператор присваивания дерева дереву.[/COLOR] А не элементов класса, элементу класса. И ввобще судя по примеру он здесь излишен.
Тогда, Вприложении есть два дерева, мне нужно чтоб
в момент Х дерево1 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????
Тогда, Вприложении есть два дерева, мне нужно чтоб
в момент Х дерево1 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????
Да нет конечно - же класса. Напишите, пожалуйста, пример почетче. Он с ошибками. Понять, что либо трудно. Чтобы все это выглядело более читабельно возьмите его в тэг
Да нет конечно - же класса. Напишите, пожалуйста, пример почетче. Он с ошибками. Понять, что либо трудно. Чтобы все это выглядело более читабельно возьмите его в тэг
Описание класса и используемых в нем типов
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 элемент
вполне коректно (вроде скоко проверял все нормально)
{
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;
}
Описание класса и используемых в нем типов
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 элемент
вполне коректно (вроде скоко проверял все нормально)
{
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;
}
В чем разница между d.dot и d->dot ???
Насчет "d->" " это когда я в месаге ошибся.
Компилятор ругается на
if(this->dot->ver!=0)this->ClearTree();
В чем разница между 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();
1.Если переменная определяется как указатель, то используется оперетар ссылки (TREE* a; a->dot), если как значение или ссылка используется точка (TREE a; a.dot; TREE& a; a.dot).
2. На вид вроде все правильно, но я не уведел описание ClearTree();
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 ;
}
Я слышал про какой-то еще конструктор копирования может так???
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 было заполнено теми же элементами что и дерево2 это что этот оператор уже должен быть оператором формы а не самого класса TREE????
ИМХО подобные операции над такими сущностями, как правило лучше реализовать дружественной фукцией типа свап или подобной - а явного присваивания избегать.
ИМХО подобные операции над такими сущностями, как правило лучше реализовать дружественной фукцией типа свап или подобной - а явного присваивания избегать.
Почему???
А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу
И ещё что значит - ИМХО???
Почему???
А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу
И ещё что значит - ИМХО???
Не - не печатных символов вроде нет - прада не понятно - такие же и стоко же ...:) - так всеже символы были или нет? Может отсутствовал символ перевода каретки.
IMHO - английская абревиатура, в русском эквиваленте - "По моему скромному мнению" - почему избегать? А какой смысл в ее использовании? Вполне четко можно определить присваивание для RAST например. Для TREE я лично не вижу необходимости в подобном операторе. Во первых, я бы не гарантировал, его корректное использование, во вторых - логический смысл - это очистка и заполнение массива - где же здесь присваивание? в третьих - это практически не контролируемые утечки памяти ну и так далее - высокая температура и грипп не способствуют мышлению...X)-
Первый и второй аргумент следует поменять местами - первый вытекает из второго...:)
Ну надеюсь что в общем моя мысль понятна.
Почему???
А вообще этот оператор заработал, но что за глюк был я не понял:
Если встать на строку с ошибкой и нажать на End, то он встает на след.символ после ; (т.е я понимаю что после ; больше символов нет) но когда я стер символы после ; а затем вновь вставил такие же и столько же пробелов, то всё заработало(т.е я понимаю там чтото было)?????
В BCB нет непечатных символов(как в WORDe)??? Я думаю что их нет, но иначе этот казус для себя обьяснить не могу
И ещё что значит - ИМХО???
Word - это текстовый процессор - а BCB - все-таки среда разработки и ей такой функционал не нужен. Ответ очень прост: судя по всему кто-то ручками копался в исходнике - при помощи Far или Dos Navigator, к примеру. И в DOS-кодировке стандартной 866 влепил в конец строки русскую букву 'а' - ее код кстати 0xA0. А в шрифтах, которые по умолчанию использует винда (в том числе и BCB) используется кодировка Windows 1251 - и русские символы там имеют совсем другие коды - если быть точнее: по порядку от 0xC0 до 0xFF. А на кодах от 0x80 до 0xC0 болтаются символы псевдографики. Так вот, в большинстве шрифтов код 0xA0 не имеет символьного представления - посему становится "невидимым". И к непечатным сиволам он не имеет ни малейшего отношения. Непечатные символы - это символы в диапазоне от 0x0 до 0x20.
[COLOR=red] ....Первый и второй аргумент следует поменять местами - первый вытекает из второго...[/COLOR]
Не совсем понял о каких ты аргументах
высокая температура и грипп не способствуют мышлению...
Ты не болей, витамины пей!!!!!!!!!