 |
кошмары в bcb |
 |
11.07.2002, 05:39
|
#1
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
кошмары в 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!!!
{}
впору за голову схватиться!
|
|
|
 |
11.07.2002, 14:03
|
#2
|
Дошкольник
Join Date: 10 2001
Location: Armenia
Posts: 61
Rep Power: 0
|
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)
{
}
|
|
|
11.07.2002, 21:53
|
#3
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally posted by Gevorg:
pered callom funcii iz VCL stoit __fastcall
|
но это совершенно никакой связи не имеет с описанной проблемой. компилятор видит неоднозначность между опережающим объявлением класса и последующим его определением. я про TComponent в моем примере.
|
|
|
12.07.2002, 14:15
|
#4
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
>...но это совершенно никакой связи не имеет с
обращу твое внимание на основную часть, которую ты, по-видимому, все-таки не заметил в ответе Gev -a:
__fastcall A::A(TComponent *Owner)
: TForm(Owner)
Т.е. конструктор наследника обязан обеспечивать инициализацию предка.
Страуструп, Дейтел, Шилдт, etc..
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
12.07.2002, 23:24
|
#5
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
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
|
обижаешь, начальник!
|
|
|
12.07.2002, 23:29
|
#6
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
хотя возможен еще один вариант - эти компоненты находятся в отдельном пространстве имен. проверю вечером, но если кто знает об этом - дайте сразу ответ плиз, а то... заплачу
|
|
|
13.07.2002, 04:37
|
#7
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
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;
};
ваши соображения?
|
|
|
13.07.2002, 19:59
|
#8
|
Дошкольник
Join Date: 10 2001
Location: Armenia
Posts: 61
Rep Power: 0
|
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 A  ublic 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
|
|
|
14.07.2002, 16:06
|
#9
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
опять опечатка, должно быть:
Code:
namespace Stdactns {class TEditCut;}
class A
{
Stdactns::TEditCut* x;
};
и дает вышеназванную ошибку
|
|
|
14.07.2002, 16:12
|
#10
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
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 и некоторых других?
|
|
|
15.07.2002, 03:39
|
#11
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
последние новости от борланда. как показали эксперименты, подсказанные моей великой интуицией (потому как из сообщений компилятора об этом никак невозможно было догадаться), все было из-за '__published' - заменив его на обычный public, я получил нужный (т. е. правильный) результат. заменив обратно, снова пришел к ошибке. так что будем работать без object inspector-а.
спасибо компании борланд за наше счастливое детство!
кстати, и результаты компиляции по ходу как-то неожиданно менялись, я так и не понял, как он решает, учитывать происшедшие в исходниках изменения или нет.
|
|
|
All times are GMT. The time now is 01:21. |
|
|