Klasy zagnieżdzone , problem z dostępem do obiektu.

Odpowiedz Nowy wątek
2011-07-30 18:10
0

Witam, od pewnego czasu męczę się z jedną rzeczą w QT, ale jest to problem bardziej dotyczący języka C++.Piszę aplikację do komunikacji z Arduino, poprzez port szeregowy , z wykorzystaniem biblioteki Qextserialport , mój problem wygląda następująco:

Klasa głowna "MainMenu.h"

class MainMenu : public Qdialog  
{
    Q_OBJECT 
public:
    explicit MainMenu(QWidget *parent = 0);
    ~MainMenu();
    Qextserialport * arduino
private slots:
    void on_testButton_clicked();
private:
    Ui::Pcr *ui; };

Definicja klasy "MainMenu.cpp"

MainMenu::MainMenu(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MainMenu)
{
    ui->setupUi(this);
   arduino = new Qextserialport("/dev/ttyACM0");
   arduino.open(QIODevice::ReadWrite);
   if (arduino->isOpen)
    {
        //konfiguracja portu
    }
   else
    {
       //tu daje error jesli port jest nie otwarty
    }
}
 
MainMenu::~MainMenu()
{
    delete ui;
}
 
void MainMenu::on_testButton_clicked()
{
    // wysylam do arduino zmienna ktora informuje o przejscie do trybu testowego
 
    Test * testwindow = new Test(this);
    testwindow->show();
} 

Teraz po nacisnieciu przycisku Test, otwiera mi sie nowe okienko, ktore takze dziedziczy po Qdialog. Implementacja tej klasy wyglada nastepujaco:

class Test : public QDialog
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = 0);
    ~Test();
private slots:
    void on_MainMenuButton_clicked();
private:
    Ui::Test *ui;
 
}; 
Test::Test(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Test)
{
    ui->setupUi(this);
}
 
Test::~Test()
{
    delete ui;
}
 
void Test::on_MainMenuButton_clicked()
{
    Test::close();
    //delete ui;
} 

i w klasie test chce tez wysylac i odbierac informacje do arduino poprzez ten sam obiekt utworzony w klasie main menu. Problem ten probowalem rozwiazac na nastepujace sposoby :

w konstruktorze klasy test pisałem po prostu MainMenu::arduino->write("BLABLABLA"), niestety kompilator protestuje,

bawilem sie klasami zaprzyjaznionymi i probowalem dostac sie do obiektu w ten sam sposob co powyzej,

rozwiazaniem na sile bylo dodanie do klasy qdialog.h obiektu arduino w ten sam sposob, w jaki tworze obiekt w klasie MainMenu, jednak wydaje mi sie ze jest to rozwiazanie nie poprawne i jesli np, skompiluje swoja aplikacje na uC z rdzeniem ARM , na ktorym mam linuxa i biblioteki Qt to mimo iz aplikacja skompiluje sie poprawnie to na Armie nie bedzie dzialac tak jak tego potrzebuje.

probowalem dodac klase "Api" ktora dziedziczy po Qdialog, tam dodawalem obiekt arduino, i zmienilem klasy MainMenu i klase Test aby dziedziczyly one po klasie api, jednak robilem to nieprawidlowo bo kompilator protestowal :)

Nie mam juz wiecej pomyslow jak sie dostac do tego obiektu niestety, szukalem rozwiazania w google, nie wiem czy ustawienie arduino jako singletonu jest poprawnym rozwiazaniem, jesli tak to jak to zrobic ? Czy problem polega na tym, że kompilator tak naprawne nie wie że obiekt klasy MainMenu a tym samym instancja arduino jest juz stworzona, dlatego nie moge sie do niej dostac ? jesli tak to jak oszukac kompilator, bo klasa MainMenu jest tworzona wraz z uruchomieniem okna a pozostale klasy dopiero po niej.

Moglbym prosic o jakies zrodla gdzie moglbym poczytac o rozwiazaniach takich problemow ?

Z gory dziekuje za odpowiedzi i poswiecony czas , pozdrawiam!

edytowany 2x, ostatnio: michal_s_z, 2011-07-30 18:38
Nie to, abym się czepiał, ale nie robi się spacji przed przecinkiem oraz pytajnikiem. - Patryk27 2011-07-30 19:06

Pozostało 580 znaków

2011-07-30 19:32
1

Zagnieżdżenie klasy nie zmienia normalnych relacji apropos dostępu,powoduje tylko,że obiekty klasy zagnieżdżonej można tworzyć wyłącznie w klasie zagnieżdżającej.
Co do przekazania,to do konstruktora klasy Test dodaj wskaźnik na Qextserialport:

explicit Test(Qextserialport *port,QWidget *parent = 0);

i tworząc obiekt w jakiejś funkcji mainmenu:

Test *t=new Test(arduino,this);

nie ma kija,żeby nie poszło


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB, 2011-07-30 19:35

Pozostało 580 znaków

2011-07-30 20:11
0

Dzieki serdeczne poszlo!

Teraz, w ten sposob mam dostep do arduino w konstruktorze klasy test, moge zmieniac opcje czytac etc, a co jesli bym chcial miec dostep do obiektu arduino, aby moc odczytywac/pisac dane np z funkcji w klasie Test?

Musze takze do ich wywolania dopisac wskaznik na port?

Pozostało 580 znaków

2011-07-30 20:14
1

Nie.Zmodyfikuj definicję klasy Test po prostu:

class Test : public QDialog
{
    Q_OBJECT
public:
    explicit Test(QWidget *parent = 0);
    ~Test();
private slots:
    void on_MainMenuButton_clicked();
private:
    Ui::Test *ui;
    Qextserialport *arduino; 
};

Definicja konstruktora zaś będzie wyglądała tak:

explicit Test(Qextserialport *port,QWidget *parent = 0):arduino(port)
{}

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB, 2011-07-30 20:16

Pozostało 580 znaków

2011-07-30 20:32
0

niestety w ten sposob nie dziala, mam pytanie dlaczego w klasie test mowisz ze mam zadeklarowac obiekt arduino ? Ten obiekt musi byc wczesniej w klasie main menu, w klasie test mam z niego korzystac.

w klasie test tak jak mowiles zmienilem definicje konstruktora na

explicit Test(QextSerialPort *port, QWidget *parent = 0); 

nastepnie jego implementacja:

 Test::Test(QextSerialPort *port, QWidget *parent) :
    QDialog(parent), 
{
 
 }

w klasie main menu po wcisnieciu buttona tworzy sie obiekt klasy test,wywolalniem

 Test * testwindow = new Test(arduino,this); 

Pozostało 580 znaków

2011-07-30 20:35
 Test::Test(QextSerialPort *port, QWidget *parent) :
    QDialog(parent), arduino(port)
{
 
 }

Tak to ujmując dokładnie ma wyglądać.Od teraz w całej klasie Test będziesz miał dostęp do obiektu Qextserialport wskazywanego przez wskaźnik andruino.A że w konstruktorze zapodajesz wskaźnik na obiekt utworzony w klasie MainMenu,to tego właśnie obiektu będziesz używać-czyli masz to,co chciałeś uzyskać


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-07-30 20:36

Pozostało 580 znaków

2011-07-30 20:41
0

Ok, juz czaję! Dzieki jeszcze raz, pozdrawiam!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0