c++ qt deklaracja obiektu w klasie nadrzednej klasy podrzednej zasięg widoczność
Ostatnio zmodyfikowano 2016-04-28 18:20
alien1983 Temat założony przez niniejszego użytkownika |
c++ qt deklaracja obiektu w klasie nadrzednej klasy podrzednej zasięg widoczność » 2016-04-25 19:09:53 Witam, mam taką klasę class A : public QObject { B nowyObiektKlasyB C nowyObiektKlasyC }
class B : public QObject { }
class C : public QObject { }
Chciałbym aby obiekt klasy B był dostępny we wszystkich metodach klasy A oraz C i ewentualnie podklasach tych klas! Jak to najprościej zrobić? mogę w każdej klasie zdeklarować nowy obiekt ale wtedy mam wiele instancji do jednej instancji terminala (klasa B - terminal wyświetla informacje z programu) |
|
aksen |
» 2016-04-25 19:49:05 w klasie A piszesz: protected B nowyObiektKlasyB;
lub public B nowyObiektKlasyB;
>>> Chciałbym aby obiekt klasy B był dostępny we wszystkich metodach klasy A przecież jest dostępny, bo jest polem klasy A (B nowyObiektKlasyB) >>> oraz C klasa C może być klasą pochodną klasy A (i wtedy obiekt klasy B będzie dostępny we wszystkich metodach C) >>> ewentualnie podklasach tych klas! to samo co w przypadku klasy C |
|
mateczek |
» 2016-04-25 20:41:41 że tak zapytam ?? chodzi Ci o statyczny składnik klasy "A" ?? Bo zwyczajny składnik klasy "A" będzie miał oddzielną instancję dla każdego obiektu tej klasy. składnik statyczny będzie wspólny dla wszystkich obiektów klasy A przykład w czystym C++ #include <iostream> #include<string> using namespace std;
class A { public: int skladnikZwykly; static int liczbaObiektow; A() { liczbaObiektow++; skladnikZwykly = 0; } }; class B : public A { }; int A::liczbaObiektow = 0;
int main() { A tablica[ 15 ]; cout << "po stworzeniu tablicy skladnik statyczny liczba obiektow " << A::liczbaObiektow << endl; B b; cout << "po stworzeniu obiektu B skladnik statyczny liczba obiektow " << A::liczbaObiektow << endl; cout << "........................................................................." << endl; tablica[ 1 ].skladnikZwykly = 23; cout << "zmienimy skladnik zwykly jednego obiektu " << tablica[ 1 ].skladnikZwykly << " " << tablica[ 2 ].skladnikZwykly << endl; tablica[ 1 ].liczbaObiektow = 23; cout << "zmienimy skladnik statyczny jednego obiektu " << tablica[ 1 ].liczbaObiektow << " " << tablica[ 2 ].liczbaObiektow << endl; }
|
|
alien1983 Temat założony przez niniejszego użytkownika |
» 2016-04-26 05:08:49 Problem polega jeszcze na tym, że wszystkie klasy dziedziczą po QObject (QT) class A : public QObject { Q_OBJECT public: B( QObject * parent = 0 ); ... class B : public QObject { Q_OBJECT public: ... class C : public QObject { Q_OBJECT public: ...
Jak poprawnie zrobić dziedziczenie klasy B po A z zachowaniem dziedziczenia po QObject ? |
|
michal11 |
» 2016-04-26 10:31:43 Dziedziczenie nie jest nagle przerywane, jeżeli A dziedziczy z QObject i B dziedziczy z A to B dziedziczy też z QObject. |
|
mateczek |
» 2016-04-26 15:21:32 Po QObject dziedziczenie robisz wtedy gdy chcesz korzystać z sygnałów i slotów (trochę upraszczam). Jeśli twoja klasa nie implementuje tego mechanizmu to dziedziczenie po QObject nie jest konieczne. https://www.youtube.com/watch?v=bxmdI4O3TGoNie wszystkie klasy w bibliotece QT dziedziczą po QObject klasy niewizualne QVector, Qstack itp. nie mają takiego dziedziczenia!!! Z kolei jak dziedziczę po klasie, która już dziedziczy po QObject nie trzeba drugi raz tego pisać. To co napisał wyżej michał11. Przykład własnego widgeta poniżej. Dziedziczenie po QWidget: https://www.youtube.com/watch?v=Ir3BDVpGfNE |
|
alien1983 Temat założony przez niniejszego użytkownika |
» 2016-04-26 20:32:01 Dzięki wielkie ;) |
|
alien1983 Temat założony przez niniejszego użytkownika |
» 2016-04-27 18:07:34 Mam kolejny problem dość ciekawy. W opcji debug działa w release wywala błąd (podczas działania) a.h #ifndef A_H #define A_H #include <iostream> #include <QObject> #include <QtCore/QDebug>
class C; class B; class A : public QObject { public: A(); C * cobject; B * bobject; test(); test2(); testB(); };
#endif
b.h #ifndef B_H #define B_H #include "a.h"
class B : public A { public: B(); test(); OK(); };
#endif
c.h #ifndef C_H #define C_H #include "a.h"
class C : public A { public: C(); test(); };
#endif
a.cpp #include "a.h" #include "b.h" #include "c.h" A::A() { }
A::test() { qDebug() << "metoda klasy A Rodzic"; bobject->test(); }
A::test2() { qDebug() << "Lulan"; }
A::testB() { }
b.cpp #include "a.h" #include "b.h" #include "c.h"
B::B() { }
B::test() { qDebug() << "metoda klasy B Potomek A"; cobject->testB(); }
B::OK() { qDebug() << "OK"; }
c.cpp #include "c.h" #include "b.h" #include "a.h"
C::C() { }
C::test() { qDebug() << "metoda klasy C Potomek A"; test(); }
main.cpp #include <QCoreApplication> #include "a.h" int main( int argc, char * argv[] ) { QCoreApplication a( argc, argv ); A aObject; aObject.test(); aObject.test2(); return a.exec(); }
|
|
« 1 » 2 3 |