Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ qt deklaracja obiektu w klasie nadrzednej klasy podrzednej zasięg widoczność

Ostatnio zmodyfikowano 2016-04-28 18:20
Autor Wiadomość
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ę
C/C++
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)
P-147651
aksen
» 2016-04-25 19:49:05
w klasie A piszesz:
C/C++
protected B nowyObiektKlasyB;
lub
C/C++
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
P-147653
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++


C/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 ]; // jest 15 obiektow klasy A z której każdy ma wewnątrz siebie obiekt skladnikZwykly.
    //ale jest tylko jeden obiekt skladnik statyczny
   
    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; //widać że wspulny ??
   
   
    cout << "........................................................................." << endl;
   
    // zmienimy skladnik zwykly jednego obiektu
    tablica[ 1 ].skladnikZwykly = 23;
    cout << "zmienimy skladnik zwykly jednego obiektu " << tablica[ 1 ].skladnikZwykly << " " << tablica[ 2 ].skladnikZwykly << endl;
   
    //a teraz zmienimy skladnik statyczny
    tablica[ 1 ].liczbaObiektow = 23;
    cout << "zmienimy skladnik statyczny jednego obiektu " << tablica[ 1 ].liczbaObiektow << " " << tablica[ 2 ].liczbaObiektow << endl; //widać że jest wspólny??
   
}
P-147659
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)

C/C++
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 ?
P-147672
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.
P-147676
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=bxmdI4O3TGo
Nie 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


 
P-147686
alien1983
Temat założony przez niniejszego użytkownika
» 2016-04-26 20:32:01
Dzięki wielkie ;)
P-147698
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
C/C++
#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 // A_H

b.h
C/C++
#ifndef B_H
#define B_H
#include "a.h"

class B
    : public A
{
public:
    B();
    test();
    OK();
};

#endif // B_H

c.h
C/C++
#ifndef C_H
#define C_H
#include "a.h"

class C
    : public A
{
public:
    C();
    test();
   
};

#endif // C_H

a.cpp
C/C++
#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
C/C++
#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
C/C++
#include "c.h"
#include "b.h"
#include "a.h"

C::C()
{
   
}

C::test()
{
    qDebug() << "metoda klasy C Potomek A";
    test();
}

main.cpp
C/C++
#include <QCoreApplication>
#include "a.h"
int main( int argc, char * argv[] )
{
    QCoreApplication a( argc, argv );
    A aObject;
    aObject.test();
    aObject.test2();
    return a.exec();
}
P-147728
« 1 » 2 3
  Strona 1 z 3 Następna strona