Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters

Reply
 
Thread Tools

кошмары в bcb
Old 11.07.2002, 05:39   #1
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post кошмары в bcb

люди, неужели bcb так плох, что не дает писать в правильном стиле?
во-первых, при работе с его визуальными средствами разработки все формы создаются как глобальные объекты. и устроить агрегацию одной формы в другую не получается (речь не идет о вызове одной формы из другой, а чтобы в классе, определяющем одну форму, был член-форма второго класса). поправьте, если я не прав.
ну ладно, этого можно избежать, если отказаться от его визуальных средств (ну и на фига тогда было создавать rad-tool?!?). пишем всухую, с нуля. форма должна иметь какие-то агрегированные компоненты, как хотелось с самого начала.
имеем:
а) vcl объекты создаются только динамически и
б) одновременно от них можно наследоваться, причем унаследованный класс автоматически приобретает такое же свойство.
такое, по-моему, не реализуешь в рамках обычного c++. ну да ладно, дело даже не в этом. но чтобы компилятор не мог разрешить 'неоднозначность' между опережающим объявлением класса и его определением?!?
.h file:
Code:
class TComponent;
class A: TForm
{
   A(TComponent* owner);
};
.c-file:
Code:
#include "vcl/file_for_TComponent_class"
A::A(TComponent* owner) // error is here!!!
{}
впору за голову схватиться!

Old 11.07.2002, 14:03   #2
Дошкольник
 
Join Date: 10 2001
Location: Armenia
Posts: 61
Rep Power: 0
Post

Esli xoroshenko posmotret' to pered callom funcii iz VCL stoit __fastcall shto opredelyaet calling convention (kak pascal, cdecl .. ). I krome etogo
Nuzhno vizvat'(kak ne stranno ))) esho i konstruktor parenta.
Voobshem zhelatel'no prochest' libo help, libo druguyu literaturu... (luchshe help....)

v kance kancov vsyo budet viglydet' tak:

v .h file e

class A : public TForm
{
__fastcall A(TComponent *Owner);
};

v .c file e

__fastcall A::A(TComponent *Owner)
: TForm(Owner)
{
}


Old 11.07.2002, 21:53   #3
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

Quote:
Originally posted by Gevorg:
pered callom funcii iz VCL stoit __fastcall
но это совершенно никакой связи не имеет с описанной проблемой. компилятор видит неоднозначность между опережающим объявлением класса и последующим его определением. я про TComponent в моем примере.

Old 12.07.2002, 14:15   #4
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
Talking

>...но это совершенно никакой связи не имеет с

обращу твое внимание на основную часть, которую ты, по-видимому, все-таки не заметил в ответе Gev -a:

__fastcall A::A(TComponent *Owner)
: TForm(Owner)

Т.е. конструктор наследника обязан обеспечивать инициализацию предка.



Страуструп, Дейтел, Шилдт, etc..
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/

Old 12.07.2002, 23:24   #5
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

Quote:
Originally posted by Greco El:
обращу твое внимание на основную часть, которую ты, по-видимому, все-таки не заметил в ответе Gev -a:

__fastcall A::A(TComponent *Owner)
: TForm(Owner)

Т.е. конструктор наследника обязан обеспечивать инициализацию предка.
ок, я допустил опечатку, из-за чего внимание gev-а отвлеклось. начну снова.
имеем forward-declaration класса TComponent (пусть все остальное написано корректно) в заголовке. включаем этот заголовок в файл, куда также включено определение TComponent. компилятор находит неоднозначность между definition и forward-declaration. а еще - fully ansi compliant!
Quote:
Страуструп, Дейтел, Шилдт, etc
обижаешь, начальник!

Old 12.07.2002, 23:29   #6
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

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

Old 13.07.2002, 04:37   #7
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

Quote:
Originally posted by Aram Hambardzumyan:
хотя возможен еще один вариант - эти компоненты находятся в отдельном пространстве имен
так и оказалось! эти классы находятся в пространствах имен, и опережающая декларация должна включать квалифицирующее имя. все, катастрофы не было
однако странно было получить на некоторых классах (TEditCut, TEditCopy, TEditPaste) сообщение Not an allowed type. help говорит: Your source file declared some sort of forbidden type; for example, a function returning a function or array.
сообщение возникает в такой ситуации:
Code:
namespace Stdactns {class TEditCut;}

class A
{
   TEditCut* x;
};
но норлаьно компилиться:
Code:
#include <StdActns.hpp>

class A
{
   TEditCut* x;
};
ваши соображения?

Old 13.07.2002, 19:59   #8
Дошкольник
 
Join Date: 10 2001
Location: Armenia
Posts: 61
Rep Power: 0
Post

Aram izveni ya ne ponyal vopros...
Esli mozhno obyasni detal'nei...

Ya rabotayu dolgoe vreme na Buildere i, chesno govorya, ni razu ne vstrechalsya s seryoznimi problemami.

Ya takzhe poslednee vreme rabotayu s MFC, tozhe net problem, ososbennix . No esli chestno mne TClassi nravyatsya bolshe.

Eto konchno delo vkusa Prosto inogda vstrechayutsya situacii pri kotorix nuzhno posovetovatsya...

Ya budu ochen' rad pomoch...

I esho tut nuzhno bit' ochen' ostorozhnim s namespace -ami. Nu esli prosto napisat'

class TComponent;
class Aublic TWincontrol
{
__fastcall A(TComponent *Owner);
}

to poyavitsya oshibka. Potomu chto TComponent opredelen v namespace e Classes.

A shto kasetsya ostal'nix sluchaev ya prosto ne ponyal vopros. Obyasni detal'nei pls. Budu rad pomoch

Old 14.07.2002, 16:06   #9
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

опять опечатка, должно быть:
Code:
namespace Stdactns {class TEditCut;}

class A
{
   Stdactns::TEditCut* x;
};
и дает вышеназванную ошибку

Old 14.07.2002, 16:12   #10
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

Quote:
Originally posted by Gevorg:
Aram izveni ya ne ponyal vopros...
Esli mozhno obyasni detal'nei...
насчет опережающего объявления TComponent вопросов не осталось, все ясно.

Quote:
Originally posted by Aram Hambardzumyan:
имеем:
а) vcl объекты создаются только динамически и
б) одновременно от них можно наследоваться, причем унаследованный класс автоматически приобретает такое же свойство.
такое, по-моему, не реализуешь в рамках обычного c++.
здесь тоже нет проблем, просто некоторые мои соображения о нестандартности.
сейчас единственный вопрос - почему выдает такое сообщение на классах TEditCut и некоторых других?

Old 15.07.2002, 03:39   #11
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Post

последние новости от борланда. как показали эксперименты, подсказанные моей великой интуицией (потому как из сообщений компилятора об этом никак невозможно было догадаться), все было из-за '__published' - заменив его на обычный public, я получил нужный (т. е. правильный) результат. заменив обратно, снова пришел к ошибке. так что будем работать без object inspector-а.
спасибо компании борланд за наше счастливое детство!
кстати, и результаты компиляции по ходу как-то неожиданно менялись, я так и не понял, как он решает, учитывать происшедшие в исходниках изменения или нет.
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 01:21.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.