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
|
Пожалуйста!
Кусок кода, где класс передается как аргумент — я тут впервые обнаружил, что Билдер может передавать класс аргументом и даже пост про это сделал (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. Закавыка именно в этом. Если кто-нибудь знает, как вставить кусочек аскального кода в Билдеровский листинг, черкните.
|
|
|