LINUX.ORG.RU

И в последний раз о передаче виджета :(


0

0

Вообщем понял в чём была моя ошибка, похоже невнимательность к правилам языка (хмм, как бы точнее выразиться, спользование 
неинициализированных данных), но то собсно что я понял говорит о том что затея напрасна, а жаль, я на неё возлагал большие надежды :(

Вот теперь тот код который полностью демонстрирует глупость затеи

main.cpp
/*********************************************************************/
#include "test.h"

int main(int argc, char **argv)
{
	QApplication app ( argc, argv );
	test *t = new test;
	app.setMainWidget(t->mw());
	t->init();
	return app.exec();
}
/*********************************************************************/

test.h
/*********************************************************************/
#ifndef _TEST_H_
#define _TEST_H_

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "inc.h"
#include "testwindow.h"
#include "testtabs.h"

/**
 * @short Application Main Window
 * @author test <alexandr@cyclon>
 * @version 0.1
 */

class test
{
public:

	test();
	virtual ~test();

	QWidget* mw();
	void init();

	testWindow *w;
	testSTabs *tab;
};

#endif // _TEST_H_
/*********************************************************************/

test.cpp
/*********************************************************************/
#include "test.h"

test::test()
{
	w = new testWindow();
	w->show();

	tab = new testSTabs();
}

test::~test()
{
}

QWidget* test::mw()
{
	return w;
}

void test::init()
{
	w->add(tab);
}

#include "test.moc"
/*********************************************************************/

testtabs.h
/*********************************************************************/
#ifndef TESTTABS_H
#define TESTTABS_H

#include "inc.h"

/**
@author test
*/
class testTabs : public QWidget
{
	Q_OBJECT

public:

	testTabs(QWidget *parent = 0, const char *name = 0);
	~testTabs();

	QPushButton *b;
};

#endif
/*********************************************************************/

testtabs.cpp
/*********************************************************************/
#include "testtabs.h"

testTabs::testTabs(QWidget *parent, const char *name)
 : QWidget(parent, name)
{
}


testTabs::~testTabs()
{
}


#include "testtabs.moc"
/*********************************************************************/

teststabs.h
/*********************************************************************/
#ifndef TESTSTABS_H
#define TESTSTABS_H

#include <testtabs.h>

/**
@author test
*/
class testSTabs : public testTabs
{
public:

    testSTabs();
    ~testSTabs();

};

#endif

/*********************************************************************/

teststabs.cpp
/*********************************************************************/
#include "teststabs.h"

testSTabs::testSTabs()
 : testTabs()
{
	b = new QPushButton(this);
	b->show();
}


testSTabs::~testSTabs()
{
}
/*********************************************************************/

testwindow.h
/*********************************************************************/
#ifndef TESTWINDOW_H
#define TESTWINDOW_H

#include "inc.h"
#include "teststabs.h"

/**
@author test
*/

class testWindow : public QWidget
{
	Q_OBJECT

public:

	testWindow(QWidget *parent = 0, const char *name = 0);
	~testWindow();

	void add(testTabs *tab);

	QPtrList <testTabs> p;

};

#endif
/*********************************************************************/

testwindow.cpp
/*********************************************************************/
#include "testwindow.h"

testWindow::testWindow(QWidget *parent, const char *name)
 : QWidget(parent, name)
{
}


testWindow::~testWindow()
{
}

void testWindow::add(testTabs* tab)
{
	p.append(new testTabs(tab));
	p.at(0)->reparent(this, QPoint(0,0));
	p.at(0)->show();
}

#include "testwindow.moc"

/*********************************************************************/

Кнопки, созданной в testSTabs::testSTabs(), не видно.

ПыСы если кому интересно о чём речь, см посты ниже.
★★★★★

>void testWindow::add(testTabs* tab)

>{

> p.append(new testTabs(tab));

> p.at(0)->reparent(this, QPoint(0,0));

> p.at(0)->show();

>}

>#include "testwindow.moc"

Ну это уже лучше, растем в профессиональном отношении. Хотя просили же _работающий пример_, а то что здесь написано вообще собрать нельзя. Где файл inc.h, где *.moc, где test.pro? Почему полно ошибок и зачем нам в примерах туча деструкторов, мы что, деструкторы отлаживаем?

Ну ладно, так кнопка конечно не будет показываться, ведь она создается в конструкторе TestSTabs, а Вы объект создаете testTabs. Может, вам какой интерфейс хочется определить?

anonymous
()
Ответ на: комментарий от anonymous

Ну начнём с того что часть кода генерена KDevelop так что *.moc генерируется им же, собсно как и скелеты классов.

Что я хочу:

Вообщем есть класс А содержащий _НЕ_ИНИЦИАЛИЗИРОВАННЫЙ_ массив указателей. И есть класс В производный от А и в котором инициализируется этот массив обьявленный в А, в моём случае одним элементом. Есть класс С в который передаётся обьект класса В _НО_ передаётся как класс А

(у меня так

void С::add(А* obj)

т.е. с неявным преобразованием

, а вызов так

В *obj = new B;
C *p = new C;
c->add(obj);

)

класса В в класс А. После передачи в С обьект класса В ведёт себя как класс А т.е. содержит _НЕ_ИНИЦИАЛИЗИРОВАННЫЙ_ массив указателей и соответственно я не могу из класса С работать с массивом, т.к. его элементы не инциализированы. Вопрос как сделать так что бы при передаче обьекта класса В в класс С, с преобразованием в класс А, можно было бы работать с ним как с В но при этом не проводя обратного преобразования, т.е. не делать преобразование (В)А. Я пологаю что это невозможно.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Т.е. ты полагаешь что в С++ невозможен полиморфизм? Ну ты и ... . Ты хоть понимаешь что ты передаешь объект класса testTabs а не testSTabs.

< p.append(new testTabs(tab));

---

> p.append(tab);

bd
()
Ответ на: комментарий от bd

Так в том то и дело что надо именно так т.е. должен быть некий общий родитель который сможет содеражить некий общий скелет который сможет содержать элементы которые я смогу иницциализировать в наследнике.

anonymous
()
Ответ на: комментарий от anonymous

Мне уже хочется тебя матом покрыть. Ты понимаешь что происходит при вызове new testTabs(tab)? Зачем тебе это нужно? Ты хоть понимаешь какая иерархия у тебя при этом получается? Ты же УЖЕ создал нужный тебе testSTabs. Вот его и передавай.

bd
()
Ответ на: комментарий от anonymous

PS:

<не мое>
У нас в банкирской конторе "Сикоморский и Цесаревич" был программист Вася. Это был чудо-программист.
Программист Вася писал программы на Дельфи. При компиляции он никогда не обращал внимания на хинты и ворнинги. Вася выделял память только тогда, когда возникал аксесс виолэйшын. Если указатель при инициализации случайно указывал на уже выделенную область памяти, то память Вася не выделял.
Один раз Вася написал программу для ГЦИ ЦБ РФ. Программа постоянно висла, и Вася написал для нее вотчдог, который раз в минуту пингал программу, и, в случае чего, перегружал машину. Но программа грузилась гораздо дольше минуты, поэтому вотчдог, грузящийся первым, не получал ответа, и перегружал машину сразу. В таком режиме программа проработала около 4-х месяцев, прежде чем кто-то что-то заметил.
Еще программист Вася написал программу отслеживания объектов на видеокартинке. Для этой цели он запускал стандартную программу, идущую в комплекте с камерой, которая оверлеем выдавала картинку на экран, а потом эту самую картинку прямо из видеопамяти и считывал. Один раз программа показала огромного размера объект, находящийся в неположенном месте, и имеющий явно враждебные намерения по отношению к ГУ ЦБ РФ по Орловской области. Когда пришли разбираться, оказалось, что этим объектом был мессадж бокс с аксесс виолэйшыном. Васина программа считала его из видеопамяти вместе с картинкой.
Еще Вася написал программу для чистки временной директории. Он readdir`ом рекурсивно считывал все директории, начиная с корня временной, и удалял из них все файлы. Надо ли говорить, что первой считанной им директорией была директория с названием ".."? Программа успокаивалась только тогда, когда доходила до своп-файла Windows.
Вот такой у нас был программист Вася.

bd
()
Ответ на: комментарий от bd

Млять я же в самом начале сказал как надо и никак иначе, подругому мне не надо, и в начале я так же отметил что так как я делаю ничего не получиться так что не надо меня крыть матом ;) так как я уже утвердил неработоспособность моего примера. И поэтому и спросил как это можно реализовать, т.е. мне надо передавать класс только одного типа и никак иначе, поскольку должна получиться универсальная конструкция, но которая помоему не получается. Если ты остыл :) и всё таки понял мой вопрос то посмотри плиз ещё раз вопрос и подскажи как можно это реализовать. Ещё раз повторяюсь, необходимо что то вроде динамической связи, не могу по другому выразиться. Буду благодарен если подскажеш как это сделать!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Да кто тебе мешает один тип передававать-то testTabs t = new testStabs (tab);

p.append(t);

p.at(0)->reparent(this, QPoint(0,0));

p.at(0)->show();

Будет работать. Чувствуешь разницу?

anonymous
()
Ответ на: комментарий от cyclon

Это ты как обычно ничего не понял. Тебе уже раза 3 сказали как это правильно делать. Если ты не понял ответов - то это исключительно твои проблемы.

bd
()
Ответ на: комментарий от bd

> Это ты как обычно ничего не понял. Тебе уже раза 3 сказали как это правильно делать. Если ты не понял ответов - то это исключительно твои проблемы.

Вот анонимус взял и привёл пример, за что ему спасибо, правдо тут проблеммы

void testWindow::add(testTabs* tab)
{
testTabs *t = new testSTabs (tab);
p.append(t);
p.at(0)->reparent(this, QPoint(0,0));
p.at(0)->show();
}

/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 я только и слышу что это мои проблеммы и не одного конкретного примера или хотя бы набросок, только без обид, просто... короче забей, видимо ты не понял что хотел или же я просто неправильно обьяснил.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Послушай, чудило, ты хоть попробовал сделать что я тебе написал несколькими сообщениями выше? Я тебе показал как надо исправить код чтобы он работал так как тебе надо.

bd
()
Ответ на: комментарий от bd

< p.append(new testTabs(tab));

---

> p.append(tab);

???

Ты про это?

Ну ты бы хоть написал что то типа "попробуй это", а то я решил что ты в качестве каментов исходный код привёл, ">" - меня сбило с толку, извини!!!

Вот только в этом примере эта шняга пашет а вот в моём проекте нет, прога падает, надо думать дальше. Ну да ладно, всё равно спасибо, и ещё раз пардон что не заметил кода :)

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Так с вылетом разобрался, всё вроде пашет, огромное спасибо!!!

Кстати по поводу p.append(new testTabs(tab)) я это к сожалению взял не с потолка а из QT'ого мана (тот что html), так вот, там использовалось именно PTR.append(new CLASS(OBJECT)) т.е. именно с new, я решил что без этого никак, а убрать чё то не догадался.

А где в инете можно прочесть про эту фишку, такое поведение на ход программы использование new вместо прямой передачи, т.е. именно этот момент, просто интересно почему всё так развернулось, никогда с этим не сталкивался.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.