Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операции = 
:(
    Опции темы
O_Nik
Дата 9.3.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток.

Вопрос:
Не перегружается операция =
имеется, например, класс, хочу его копировать, создавая новый объект класса и приравнивая имеющийся к нему
Код

class TBlock
{
protected:
void __fastcall SetX(int);
int __fastcall GetX(void);
void __fastcall SetY(int);
int __fastcall GetY(void);
float __fastcall GetA(void);
float __fastcall GetB(void);
void __fastcall SetInverse(bool);
bool __fastcall GetInverse(void);
int FX;
int FY;
float FA;
float FB;
bool FInverse;    
mColor FFillColor;
mColor FContourColor;
float FContourWidth;
float FFontSize;
mColor FFontColor;
float FontCoef;
AnsiString FTimeCoef;
float HLPercent;
bool FMultiInput;
mBlockIO FInOut;

public:
TBlock(void);
__property int X={read=GetX, write=SetX};
__property int Y={read=GetY, write=SetY};
__property float A={read=GetA, write=FA};
__property float B={read=GetB, write=FB};
__property bool Inverse={read=GetInverse, write=SetInverse};
__property bool MultiInput={read=FMultiInput};
__property mBlockIO InOut={read=FInOut};
__property mColor FillColor={read=FFillColor, write=FFillColor};
__property mColor ContourColor={read=FContourColor, write=FContourColor};
__property mColor FontColor={read=FFontColor, write=FFontColor};
__property float ContourWidth={read=ContourWidth, write=ContourWidth};
__property float FontSize={read=FFontSize, write=FFontSize};
//Перегрузка =
TBlock& operator= (TBlock Bl);
};

реализация перегрузки:
Код

TBlock& TBlock::operator= (TBlock Bl)
{
FX=Bl.FX;
FY=Bl.FY;
FA=Bl.FA;
FB=Bl.FB;
FInverse=Bl.FInverse;
FFillColor=Bl.FFillColor;
FContourColor=Bl.FContourColor;
FContourWidth=Bl.FContourWidth;
FFontSize=Bl.FFontSize;
FFontColor=Bl.FFontColor;
FontCoef=Bl.FontCoef;
FTimeCoef=Bl.FTimeCoef;
HLPercent=Bl.HLPercent;
FMultiInput=Bl.FMultiInput;
FInOut=Bl.FInOut;
return *this;
}

вместо моей перегрузки (копирования свойств) получается ссылка на объект, т.е. если объявить 2 реализации TBlock и одной приравнять другую, то свойства не скопируются, а просто произойдет ссылка на объект, т.е. a=b, а станет объектом b, а не просто скопирует его свойства
как правильно перегрузить = в данном случае?
и почему не вводя перегрузки = она уже есть?
PM MAIL   Вверх
ama_kid
Дата 9.3.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Ну, не знаю, я слабал тестовый пример - и в нем все работает нормально:
Код

class TMyClass
{
protected:
 char str[15];
public:
 TMyClass(void);
 void SetStr(const char *Value){strcpy(str,Value);}
 char * GetStr(){return str;}
 bool Init;
 TMyClass& operator = (TMyClass Bl);
};

TMyClass::TMyClass(void)
{
    
}

TMyClass& TMyClass::operator= (TMyClass Bl)
{
    Init=Bl.Init;
    memset (str, 0, sizeof(str));
    strcpy(str,Bl.str);     // Можно и Bl.GetStr();
    strcat(str," (Copied)");
    return *this;
}

....где-то в программе...

    TMyClass a,b;

    a.Init  = true;
    a.SetStr("str");
    b=a;
    a.Init = false;
    a.SetStr("nonstr"); 
    if (b.Init) MessageBox(NULL,a.GetStr(),b.GetStr(),0);
    if (a.Init) MessageBox(NULL,b.GetStr(),a.GetStr(),0);

Выдается только первый MessageBox с разными заголовком и текстом... Посмотри-поанализируй, в чем принципиальные различия...

Цитата
и почему не вводя перегрузки = она уже есть?

Наверное, потому, что по умолчанию для объектов по операции = делается копирование значений со всей памяти, занимаемой объектом-источником в память целевого объекта, а при идентичности типов - это фактическое дублирование, что и наблюдаем...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
O_Nik
Дата 9.3.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



объявляю TBlock через указатель (мне надо через него)
Код

TBlock *a,*b;
a=new TBlock;
b=new TBlock;
....
дальше аналогично

PM MAIL   Вверх
Vyacheslav
Дата 9.3.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Код

*a = *b;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
O_Nik
Дата 9.3.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое, очень признателен smile
и еще если можно поясните пожалуйста, почему в классе, где есть свойство с определенной операцией перегрузки =, появляется операция перегрузки = для самого класса (а где нет такого свойства - не появляется).
например если класс имеет поле AnsiString (с перегруженным=, то и класс имеет перегруженное =)
Код

class MyClass
{
public:
AnsiString s;
};

class MyClass2
{
public:
AnsiString s;
};

...

MyClass m;
m.operator=???? откуда появляется, разве тут наследование от AnsiString? (в суфлере можно видеть)

MyClass2 n;
n. - никакой перегрузки (как и предполагалось)

объясните подалуйста данный механизм наследования, заранее спасибо.
PM MAIL   Вверх
Vyacheslav
Дата 10.3.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(O_Nik @  9.3.2007,  21:03 Найти цитируемый пост)
операцией перегрузки 

Ничего не понял. Что такое "операция перегрузки"? В С++ нет такого термина. Есть теримин "перегруженная операция"


Цитата(O_Nik @  9.3.2007,  21:03 Найти цитируемый пост)
почему в классе, где есть свойство 


Цитата(O_Nik @  9.3.2007,  21:03 Найти цитируемый пост)
где нет такого свойства

И где в указанных классах есть, по Вашему мнению, свойство, а где нет? 
Код

class MyClass
{
public:
AnsiString s;
};

class MyClass2
{
public:
AnsiString s;
};



Они совершенно идентичны кроме названия. А вообще бы я бы посоветовал для начала ознакомиться с основами С++. Из них Вы можете узнать, что компилятор обзязан в случае если этого не сделал программист, создать для класса  
1.конструктор по умолчанию
2.деструктор
3.конструктор копировния,
4. оператор присваивания





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
O_Nik
Дата 10.3.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

перегруженная операция

:( я не так выразился, глупо конечно :(
а тут опечатка, должно быть, что-то вроде этого:
Код

class MyClass
{
public:
AnsiString s;
};

class MyClass2
{
public:
int a;
};

почему в MyClass перегружена операция =, а в MyClass2 - нет?

PM MAIL   Вверх
Vyacheslav
Дата 12.3.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



А она есть smile  
 
Код

  MyClass a1, a2;
  MyClass2 b1, b2;
  a2.s = "qwerty";
  b2.a = 5;
  a1 = a2;
  b1=b2;

Если Вы свою информацию будете черпать исключительно из подсказчика, то не далеко уйдете.
Кстати Ваши два класса
Код

class MyClass
{
public:
AnsiString s;
};

class MyClass2
{
public:
int a;
};

несмотря на разный тип члена класса (class member)  по сути  опять же ничем не отличаются и оба не имеют никаких свойств ( property ) smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
O_Nik
Дата 12.3.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, в любом случае вы мне помогли smile.

p.s.
про свойство property я и не говорил,
да и суфлеру не доверял особо, иначе бы спрашивать не стал.
PM MAIL   Вверх
Vyacheslav
Дата 12.3.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(O_Nik @  12.3.2007,  12:44 Найти цитируемый пост)
про свойство property я и не говорил,


smile Смотрим выше 

Цитата(O_Nik @  9.3.2007,  21:03 Найти цитируемый пост)
есть свойство с определенной 


Цитата(O_Nik @  9.3.2007,  21:03 Найти цитируемый пост)
а где нет такого свойства 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
O_Nik
Дата 12.3.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



...хорошо элемент класса или поле класса, если так угодно, а не свойство (надеюсь я тут в терминологию попал smile )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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