Ну это уже лучше, растем в профессиональном отношении. Хотя просили же _работающий пример_, а то что здесь написано вообще собрать нельзя. Где файл inc.h, где *.moc, где test.pro? Почему полно ошибок и зачем нам в примерах туча деструкторов, мы что, деструкторы отлаживаем?
Ну ладно, так кнопка конечно не будет показываться, ведь она создается в конструкторе TestSTabs, а Вы объект создаете testTabs. Может, вам какой интерфейс хочется определить?
Ну начнём с того что часть кода генерена KDevelop так что *.moc генерируется им же, собсно как и скелеты классов.
Что я хочу:
Вообщем есть класс А содержащий _НЕ_ИНИЦИАЛИЗИРОВАННЫЙ_ массив указателей. И есть класс В производный от А и в котором инициализируется этот массив обьявленный в А, в моём случае одним элементом. Есть класс С в который передаётся обьект класса В _НО_ передаётся как класс А
(у меня так
void С::add(А* obj)
т.е. с неявным преобразованием
, а вызов так
В *obj = new B;
C *p = new C;
c->add(obj);
)
класса В в класс А. После передачи в С обьект класса В ведёт себя как класс А т.е. содержит _НЕ_ИНИЦИАЛИЗИРОВАННЫЙ_ массив указателей и соответственно я не могу из класса С работать с массивом, т.к. его элементы не инциализированы. Вопрос как сделать так что бы при передаче обьекта класса В в класс С, с преобразованием в класс А, можно было бы работать с ним как с В но при этом не проводя обратного преобразования, т.е. не делать преобразование (В)А. Я пологаю что это невозможно.
Так в том то и дело что надо именно так т.е. должен быть некий общий родитель который сможет содеражить некий общий скелет который сможет содержать элементы которые я смогу иницциализировать в наследнике.
Мне уже хочется тебя матом покрыть. Ты понимаешь что происходит при вызове new testTabs(tab)? Зачем тебе это нужно? Ты хоть понимаешь какая иерархия у тебя при этом получается? Ты же УЖЕ создал нужный тебе testSTabs. Вот его и передавай.
<не мое>
У нас в банкирской конторе "Сикоморский и Цесаревич" был программист Вася. Это был чудо-программист.
Программист Вася писал программы на Дельфи. При компиляции он никогда не обращал внимания на хинты и ворнинги. Вася выделял память только тогда, когда возникал аксесс виолэйшын. Если указатель при инициализации случайно указывал на уже выделенную область памяти, то память Вася не выделял.
Один раз Вася написал программу для ГЦИ ЦБ РФ. Программа постоянно висла, и Вася написал для нее вотчдог, который раз в минуту пингал программу, и, в случае чего, перегружал машину. Но программа грузилась гораздо дольше минуты, поэтому вотчдог, грузящийся первым, не получал ответа, и перегружал машину сразу. В таком режиме программа проработала около 4-х месяцев, прежде чем кто-то что-то заметил.
Еще программист Вася написал программу отслеживания объектов на видеокартинке. Для этой цели он запускал стандартную программу, идущую в комплекте с камерой, которая оверлеем выдавала картинку на экран, а потом эту самую картинку прямо из видеопамяти и считывал. Один раз программа показала огромного размера объект, находящийся в неположенном месте, и имеющий явно враждебные намерения по отношению к ГУ ЦБ РФ по Орловской области. Когда пришли разбираться, оказалось, что этим объектом был мессадж бокс с аксесс виолэйшыном. Васина программа считала его из видеопамяти вместе с картинкой.
Еще Вася написал программу для чистки временной директории. Он readdir`ом рекурсивно считывал все директории, начиная с корня временной, и удалял из них все файлы. Надо ли говорить, что первой считанной им директорией была директория с названием ".."? Программа успокаивалась только тогда, когда доходила до своп-файла Windows.
Вот такой у нас был программист Вася.
Млять я же в самом начале сказал как надо и никак иначе, подругому мне не надо, и в начале я так же отметил что так как я делаю ничего не получиться так что не надо меня крыть матом ;) так как я уже утвердил неработоспособность моего примера. И поэтому и спросил как это можно реализовать, т.е. мне надо передавать класс только одного типа и никак иначе, поскольку должна получиться универсальная конструкция, но которая помоему не получается.
Если ты остыл :) и всё таки понял мой вопрос то посмотри плиз ещё раз вопрос и подскажи как можно это реализовать. Ещё раз повторяюсь, необходимо что то вроде динамической связи, не могу по другому выразиться.
Буду благодарен если подскажеш как это сделать!
/home/alexandr/Documents/Coding/C++/MyProjects/test/src/testwindow.cpp: In member function `void testWindow::add(testTabs*)':
/home/alexandr/Documents/Coding/C++/MyProjects/test/src/testwindow.cpp:34: error: no matching function for call to `testSTabs::testSTabs(testTabs*&)'
/home/alexandr/Documents/Coding/C++/MyProjects/test/src/teststabs.h:29: note: candidates are: testSTabs::testSTabs(const testSTabs&)
/home/alexandr/Documents/Coding/C++/MyProjects/test/src/teststabs.h:32: note: testSTabs::testSTabs()
gmake[2]: *** [testwindow.o] Ошибка 1
gmake[2]: Цель `all' не была пересобрана из-за ошибок.
gmake[2]: Цель `all-am' не требует выполнения команд.
gmake[1]: *** [all-recursive] Ошибка 1
gmake: *** [all] Ошибка 2
*** Завершено с кодом: 2 ***
но может поборю
вот это и есть помощь, а от тебя bd я только и слышу что это мои проблеммы и не одного конкретного примера или хотя бы набросок, только без обид, просто... короче забей, видимо ты не понял что хотел или же я просто неправильно обьяснил.
Послушай, чудило, ты хоть попробовал сделать что я тебе написал несколькими сообщениями выше? Я тебе показал как надо исправить код чтобы он работал так как тебе надо.
Ну ты бы хоть написал что то типа "попробуй это", а то я решил что ты в качестве каментов исходный код привёл, ">" - меня сбило с толку, извини!!!
Вот только в этом примере эта шняга пашет а вот в моём проекте нет, прога падает, надо думать дальше. Ну да ладно, всё равно спасибо, и ещё раз пардон что не заметил кода :)
Так с вылетом разобрался, всё вроде пашет, огромное спасибо!!!
Кстати по поводу p.append(new testTabs(tab)) я это к сожалению взял не с потолка а из QT'ого мана (тот что html), так вот, там использовалось именно PTR.append(new CLASS(OBJECT)) т.е. именно с new, я решил что без этого никак, а убрать чё то не догадался.
А где в инете можно прочесть про эту фишку, такое поведение на ход программы использование new вместо прямой передачи, т.е. именно этот момент, просто интересно почему всё так развернулось, никогда с этим не сталкивался.