C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Класс как аргумент функци
basil
Отправлено: 16.10.2003, 07:58


Не зарегистрирован







Есть
1. Проект основной
2. Проект библиотека с функцией
3. Проект библиотека с классами

Проблема передаю из (1) в функцию из (2) аргументом класс из (3)
(Класс везде виден ибо подключен из (3))
дебажу и вижу

в (1) при отправке аргумента значения одни при входе функции (2)
в аргументе часть членов класса остались с теми же значениями а часть нет. Если есть мысли почему я весь внимание. Спасибо.
Георгий
Отправлено: 16.10.2003, 08:52


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Полтергейст это.

Класс передаётся по ссылке или по значению?

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

Кстати — нечто аналогичное видел в bc 3.1 — при некоторых настройках компилятора он считал, что переданное по ссылке значение не должно меняться и оптимизацию проводил с учётом этого, что и приводило к аналогичным результатам.
iAlexander
  Отправлено: 17.10.2003, 18:51


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Пожалуйста! ohmy.gif
Кусок кода, где класс передается как аргумент — я тут впервые обнаружил, что Билдер может передавать класс аргументом и даже пост про это сделал (Object Pascal). Покажите, пожалуйста, объявление класса или сопутствующие вызову функции строки.
Георгий
Отправлено: 17.10.2003, 22:39


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Я с object pascal не дружу — даже синтаксис уже забыл...

куски с передачей обьектов в функции (несмотря на разнообразные позы чудес не наблюдается):
CODE
class asd
{
public:
asd(void);
asd(const asd&);
~asd(void);
asd& operator=(const asd&);
public:
int a;
float b;
char c[20];
};

void Write(const asd& a, AnsiString b="")
{
AnsiString str;
str.printf("this=%p a=%i b=%f c=%s",&a,a.a,a.b,a.c);
Form1->Memo1->Lines->Add(b);
Form1->Memo1->Lines->Add(str);
};

asd::asd(void)
{
this->a=0;
this->b=0;
this->c[0]=0;
Write(*this,"constructor");
};
asd::asd(const asd& a)
{
*this=a;
Write(*this,"copy constructor");
}
asd::~asd(void)
{
};
asd& asd::operator=(const asd& a)
{
this->a=a.a;
this->b=a.b;
strncpy(this->c,a.c,sizeof(this->c)-1);
Write(*this,"operator=");
return *this;
};

void function1(const asd& a)
{
asd& b=(asd&)a;
b.a=13;
b.b=0.666;
strncpy(b.c,"asd",sizeof(b.c)-1);
Write(a);
};

void function2(asd& a)
{
a.a=13;
a.b=0.666;
strncpy(a.c,"asd",sizeof(a.c)-1);
Write(a);
}

void function3(asd* a)
{
a->a=13;
a->b=0.666;
strncpy(a->c,"asd",sizeof(a->c)-1);
Write(*a);
}

asd function4(asd a)
{
asd ret;
a.a=13;
a.b=0.666;
strncpy(a.c,"asd",sizeof(a.c)-1);
ret=a;
Write(a);
Write(ret);
return ret;
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
asd a,b,c;
a=b;
this->Memo1->Lines->Add("before function1");
function1(a);
this->Memo1->Lines->Add("after function1");
a=b;
this->Memo1->Lines->Add("before function2");
function2(a);
this->Memo1->Lines->Add("after function2");
a=b;
this->Memo1->Lines->Add("before function3");
function3(&a);
this->Memo1->Lines->Add("after function3");
a=b;
this->Memo1->Lines->Add("before function4");
c=function4(a);
this->Memo1->Lines->Add("after function4");
}


Примечание:
копирующий конструктор, конструктор по умолчанию, оператор копирования вроде требуются по стандарту ANSI — поэтому, что бы избежать чудес со стеком их лучше всего всегда реализовывать.

Отредактировано Георгий — 17/10/2003, 23:48
iAlexander
Отправлено: 18.10.2003, 10:41


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Да нет, я просил показать передачу именно _класса_ как аргумента, а не передачу объекта класса. Т.е. в Обжект Паскале возможна передача класса(!) как аргумента. В Билдере кажется, что-то подобное реализуется с помощью TMetaClass. Закавыка именно в этом. Если кто-нибудь знает, как вставить кусочек аскального кода в Билдеровский листинг, черкните.

Вернуться в Вопросы программирования в C++Builder