Klasse an andere Klasse übergeben

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Klasse an andere Klasse übergeben

Beitrag von Ramnad » Mi Mai 04, 2016 6:46 pm

Hi zusammen,

ich versuche gerade einen raspberry pi zu programieren und habe da ein problem. und blöderweise auch noch zeitdruck :|
ich habe eine Klasse MainWindow und eine Klasse MobilePlatform, beide erstelle ich einen member in int main.
dann will ich über eine methode setMobilePlatform denn member von MobilePlattform an MainWIndow übergeben.
hier der code dazu.

Code: Alles auswählen

#include "mainwindow.h"
#include <QApplication>
#include "wiringPi.h"
#include "mobileplatform.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    wiringPiSetup();
    MainWindow w;
    MobilePlatform *m_pMobilePlatform;
    w.setMobilePlatform(m_pMobilePlatform);

    w.show();

    return a.exec();

}
die methode sieht so aus

Code: Alles auswählen

MainWindow::setMobilePlatform(MobilePlatform *platform)
{
    vmplatform = new platform;
}
das mache ich damit ich im konstruktor dann signale vom Mainwindow (eine GUI) mit den slots der MobilePLatform zu verbinden

Code: Alles auswählen

connect(ui->Vorwaerts, SIGNAL(clicked()), vmplatform, SLOT(slot_moveForward()));
nur kriege ich da folgende fehlermeldung 5 mal:
/home/pi/Desktop/MS1/MasterRobots/mainwindow.cpp:12: error: no matching function for call to 'MainWindow::connect(QPushButton*&, const char*, MobilePlatform&, const char*)'
connect(ui->Vorwaerts, SIGNAL(clicked()), vmplatform, SLOT(slot_moveForward()));
^
und noch diese hier:
/home/pi/Desktop/MS1/MasterRobots/mainwindow.h:18: error: candidate is: void MainWindow::setMobilePlatform(MobilePlatform*)
void setMobilePlatform(MobilePlatform *platform);
^
und noch 2 andere.

was ist falsch an meiner übergabe? habe ich vielleicht die variable vmplatform falsch defieniert (diese habe ich in mainwindow.h definiert als:MobilePlatform vmplatform; )?

hoffe ihr könnt mir paar tips geben.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Klasse an andere Klasse übergeben

Beitrag von Xin » Mi Mai 04, 2016 7:32 pm

Ramnad hat geschrieben:ich versuche gerade einen raspberry pi zu programieren und habe da ein problem. und blöderweise auch noch zeitdruck :|
Umso besser sind detaillierte Informationen.
Ramnad hat geschrieben:

Code: Alles auswählen

    MainWindow w;
    MobilePlatform *m_pMobilePlatform;
    w.setMobilePlatform(m_pMobilePlatform);

    w.show();

    return a.exec();
}

MainWindow::setMobilePlatform(MobilePlatform *platform)
{
    vmplatform = new platform;
}
Uffz...

Du kopierst(!) eine uninitialisierte Variable in eine set-Funktion und die Set-Funktion machst ein new, bei dem ich mich wundern würde, wenn das kompiliert.

Was bezweckst du hier? Eine Set-Funktion sollte es vorhandenes setzen und nichts erzeugen.
Ramnad hat geschrieben: das mache ich damit ich im konstruktor dann signale vom Mainwindow (eine GUI) mit den slots der MobilePLatform zu verbinden

Code: Alles auswählen

connect(ui->Vorwaerts, SIGNAL(clicked()), vmplatform, SLOT(slot_moveForward()));
Wo?
Ramnad hat geschrieben: nur kriege ich da folgende fehlermeldung 5 mal:
/home/pi/Desktop/MS1/MasterRobots/mainwindow.cpp:12: error: no matching function for call to 'MainWindow::connect(QPushButton*&, const char*, MobilePlatform&, const char*)'
connect(ui->Vorwaerts, SIGNAL(clicked()), vmplatform, SLOT(slot_moveForward()));
^
vmplattform ist also vom Typ "MobilePlatform &"? Sollte das nicht ein Zeiger sein?
Ramnad hat geschrieben: und noch diese hier:
/home/pi/Desktop/MS1/MasterRobots/mainwindow.h:18: error: candidate is: void MainWindow::setMobilePlatform(MobilePlatform*)
void setMobilePlatform(MobilePlatform *platform);
^
und noch 2 andere.
Kein Quelltext und als Fehlermeldungen "und noch zwei andere". :D

Joah... ^^
Ramnad hat geschrieben:was ist falsch an meiner übergabe? habe ich vielleicht die variable vmplatform falsch defieniert (diese habe ich in mainwindow.h definiert als:MobilePlatform vmplatform; )?
Könnte sein. Dafür wäre es sinnvoll wenigstens die Deklaration zu sehen zu können. Die Fehlermeldung von connect weißt vorsichtig darauf hin.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Ramnad
Beiträge: 12
Registriert: Do Okt 29, 2015 3:10 pm

Re: Klasse an andere Klasse übergeben

Beitrag von Ramnad » Do Mai 05, 2016 8:48 am

Hi danke für deine antwort.

ja hab die anderen beiden fehlermeldungen nicht rein gestellt weil dachte wird vielleicht zu viel und ließt sich keine durch :)
aber sobald ich wieder am PI bin werde ich es nachholen
Uffz...
Du kopierst(!) eine uninitialisierte Variable in eine set-Funktion und die Set-Funktion machst ein new, bei dem ich mich wundern würde, wenn das kompiliert.
Was bezweckst du hier? Eine Set-Funktion sollte es vorhandenes setzen und nichts erzeugen.
ok also dard ich das new nicht in der set-methode machen aber wie dann so etwa?

Code: Alles auswählen

MainWindow w;
MobilePlatform *m_pMobilePlatform;
m_pMobilePlatform= new platform;
w.setMobilePlatform(m_pMobilePlatform);
aber dann übergebe ich ihm ja keinen zeiger mehr oder nich?
wie hätte man es den richtig gelöst?
Ramnad hat geschrieben:
das mache ich damit ich im konstruktor dann signale vom Mainwindow (eine GUI) mit den slots der MobilePLatform zu verbinden
Code: Alles auswählen
connect(ui->Vorwaerts, SIGNAL(clicked()), vmplatform, SLOT(slot_moveForward()));
Wo?
die connect funktion rufe ich in der cpp.-datei vom mainwindow auf.
Könnte sein. Dafür wäre es sinnvoll wenigstens die Deklaration zu sehen zu können. Die Fehlermeldung von connect weißt vorsichtig darauf hin.
wovon brauchst du die deklaration dann stelle ich das rein. oder soll ich den ganzen code mal reinpacken?

ziel ist es wie gesagt das ich beide objekte in der int main erstelle und das objekt von MobilePlatform
an MainWindow übergebe um diese connect-Funktionen zu schreiben im Konstruktor von MainWindow.
ich komme aber glaube ich mit der Objekterstellung und dieser übergabe mit dem Zeiger durcheinander so mein gefühl zumindest.
wie seiht den ein besserer ansatz aus?

Viele Grüße
Ramnad

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Klasse an andere Klasse übergeben

Beitrag von Xin » Do Mai 05, 2016 10:00 am

Ramnad hat geschrieben:
Was bezweckst du hier? Eine Set-Funktion sollte es vorhandenes setzen und nichts erzeugen.
ok also dard ich das new nicht in der set-methode machen aber wie dann so etwa?
Was willst Du machen!?
Set ist in der Programmierung eine Floskel, dass Du etwas übergibst und eine Member-Variable in der Klasse überschreibst.
Darin sollte kein 'new' auftreten. Ein gesetzliches Verbot gibt es nicht.
Ramnad hat geschrieben:

Code: Alles auswählen

MainWindow w;
MobilePlatform *m_pMobilePlatform;
m_pMobilePlatform= new platform;
w.setMobilePlatform(m_pMobilePlatform);
aber dann übergebe ich ihm ja keinen zeiger mehr oder nich?
wie hätte man es den richtig gelöst?
Erstens übergibst Du ihm einen Zeiger (MobilePlatform *) und zweitens kann ich Dir nicht sagen was "richtig" ist. Falsch erscheint mir mit hoher Wahrscheinilchkeit (ich kenne den Quelltext nicht), da 'new plattform'. Ich gehe davon aus, dass Du 'new MobilePlatform' meinst - schreibst Du hier aber nicht.

Um zu sagen, was "richtig" ist, müsste ich das Problem kennen. So wie du das machst, kann man das machen. Ist die MobilePlatform abhängig von MainWindow? Ist MainWindow abhängig von MobilePlatform? Besteht eine Abhängigkeit mach die Übergabe über den Konstruktor, ansonsten ist m_pMobilePlatform bis zum Setzen invalid. Vergisst Du das Setzen, ist das Objekt trotzdem da und funktioniert [nicht].
Ramnad hat geschrieben:
Könnte sein. Dafür wäre es sinnvoll wenigstens die Deklaration zu sehen zu können. Die Fehlermeldung von connect weißt vorsichtig darauf hin.
wovon brauchst du die deklaration dann stelle ich das rein. oder soll ich den ganzen code mal reinpacken?
Ich rate hier. Du hast Designfragen, Du hast Syntaxfehler und ich habe nichts woran mich orientierten kann.
Ramnad hat geschrieben:ziel ist es wie gesagt das ich beide objekte in der int main erstelle und das objekt von MobilePlatform
an MainWindow übergebe um diese connect-Funktionen zu schreiben im Konstruktor von MainWindow.
ich komme aber glaube ich mit der Objekterstellung und dieser übergabe mit dem Zeiger durcheinander so mein gefühl zumindest.
wie seiht den ein besserer ansatz aus?
Das - wie gesagt - ist abhängig von den Abhängigkeiten. Sind die Objekte gleichwertig nebeneinander, dann werden sie auch unabhängig voneinander erzeugt und z.B. mit set miteinander verknüpft, damit sie miteinander agieren können. Wenn ein Objekt ohne das andere nicht funktionsfähig existieren kann, sollte es auch seine Abhängigkeit auch gleich im Konstruktor übergeben bekommen.
Sind sie abhängig voneinander, sollte das abhängige Objekt vom übergeordneten Objekt erzeugt werden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten