AnfängerFrage zu Klassenübergreifenden Variablen



  • Das versteh ich aber noch nicht so ganz...

    class A
    {
        int variable;
    
    public:
        int get_variable()
        {
           return variable;
        }
    };
    

    Das Muss dann in meine Klasse wo ich den Inhalt der Variable herbekomme???

    class B
    {
    public:
        void foo(const A &a)
        {
           a.get_variable();   // variable lesen.
        }
    };
    

    Und das muss in die Klasse wo ich dann die Variable wieder auslesen möchte???

    Und alles in die Header Datein bei den Cpp datein dann einfach die Variable ansprechen?

    ist das so richtig???
    EDIT:

    Ich hab das jetzt mal so gemacht:

    HeaderFile Class 1

    QString Inhalt;
    
    public:
        QString get_Inhalt()
        {
           return Inhalt;
        }
    

    Cpp Datei Class 1

    Inhalt = sTextEditText; //Ist die Variable deren Inhalt ich möchte.
    

    Ja dann Haben wenn ichs starte Inhalt und sTextEditText den selben Wert.

    Aber den 2ten Teil Das in die andere Klasse zu bekommen Krieg ich nicht hin... bekomm ich lauter Errors.

    Aber ich denke ich Impementier das auch ganz falsch.

    Kannst du mir dann noch schreiben wie und was ich in Header und Cpp File von Class 2 schreiben muss?



  • GT schrieb:

    Das versteh ich aber noch nicht so ganz...

    Also nochmal zum Mitschreiben...

    Du kannst auf eine Variable einer Klasseninstanz, auch Objekt genannt, nur über das entsprechende Objekt zugreifen. Du kannst auf eine statische Variable einer Klasse über die Klasse zugreifen. So... nun fügen wir dies zusammen und halten uns an eine weitere Regel der Objektorientierten Programmierung: Datenkapselung (Keinen direkten unkontrolierten Zugriff auf Membervariablen erlauben).

    Gegeben ist eine Klasse A mit ein paar Membern und eine Klasse B deren Objekte einmal auf einen statischen Member und einmal auf einen Objektbezogenen Member zugreifen soll.

    // A.h

    #if !defined(A_HEADER)
    #define A_HEADER
    
    class A
    {
      private:
        int value1;
        static int value2; 
    
      public:
        int getValue1();
        int setValue1(int newValue);
        static int getValue2();
        static int setValue2(int newValue);
    };
    
    #endif
    

    // A.cpp

    #include "A.h"
    
    int A::value2 = 0;
    
    int A::getValue1() { return value1; }
    int A::setValue1(int newValue) { value1 = newValue; }
    int A::getValue2() { return value2; }
    int A::setValue2(int newValue) { value2 = newValue; }
    

    // B.h

    #if !defined(B_HEADER)
    #define B_HEADER
    
    class A;
    
    class B
    {
      public:
        void foo(A& obj);
    };
    
    #endif
    

    // B.cpp

    #include "A.h"
    
    void B::foo(A& obj)
    {
        // Beispiel 1: Zugriff auf statischen Member
        A::setValue2(12);
    
        // Beispiel 2: Zugriff auf Member eines Objektes
        obj.setValue1(12);
    }
    

    GT schrieb:

    Das Muss dann in meine Klasse wo ich den Inhalt der Variable herbekomme???

    Ja, du musst von A irgendein Objekt haben (es sei den es sind statische Member), um auch auf die Variablen zugreifen zu können. Hierbei berücksichtigt man aber auch Datenkapselung etc.

    Dabei kann das Objekt entweder ein Teil von B sein (Sprich als Membervariable definiert sein) oder irgendwie übergeben werden.

    GT schrieb:

    Und alles in die Header Datein bei den Cpp datein dann einfach die Variable ansprechen?

    Du kannst die Variable bei sauberer Trennung (Datenkapselung) niemals "direkt" ansprechen, sondern über die veröffentlichte Schnittstelle.

    cu André



  • Mönsch, Leute, investiert doch mal etwas Geld in Bildung. Sprich in ein C++-Lehrbuch. 😉 Das sind doch wirklich Sachen, die in einem guten C++-Buch erklärt werden. 🙂



  • Artchi schrieb:

    Mönsch, Leute, investiert doch mal etwas Geld in Bildung...

    Aber übertreibt es auch nicht wenn der Chef sehr wechselhaft ist (Sprich man vielleicht in das falsche Thema zuviel Geld investiert hat)...

    cu André



  • Danke schonmal.

    Was wäre denn dann ein gutes C++ Buch???





  • Ich blick da immernoch nicht durch...

    gibts da ne anständige Bezeichnung für damit ich mal im Internet nach einer Doku oder Anleitung suchen kann?



  • Nö, das ist doch ganz normale objektorientiertung in C++. Schau dir doch einfach mal fremden Code an. Diesen Debuggen und schauen was passiert, kann auch helfen. Ohne Literatur oder fremden Code durchstöbern, wird das sonst nichts. Sind wirklich Basics, die man irgendwann drauf hat. Das es beim ersten Versuch nicht Klick macht, sollte einen aber auch nicht demotivieren. Das dürfte bei vielen Anfänger so sein.



  • Es gibt auch Online-Tutorials.
    http://tutorial.schornboeck.net/oop2.htm
    Bücher sind natürlich besser.



  • GT schrieb:

    Ich blick da immernoch nicht durch...

    gibts da ne anständige Bezeichnung für damit ich mal im Internet nach einer Doku oder Anleitung suchen kann?

    Nein, da es eine absolute Grundlage ist und diese in jedem sinnvollen Buch beschrieben ist wenn man keine Seite unterschlägt.

    Aber um es dir mal in Nicht-C++ zu erklären, da es für manche einfacher ist (Wobei ich mich frage ob du nicht ein Troll bist der sich nur anstellt):

    1. Begriff Klasse/Objekt
    Eine der wichtigsten Grundlagen um überhaupt das ganze zu verstehen ist schon mal der Unterschied zwischen Klasse und Objekt zu verstehen. Wenn ich dich z.B. nach deinem Computer frage, verstehst du was ich mit dem Begriff Computer meine, obwohl ich dir keine genaue Beschreibung gegeben habe. Unser Gehirn abstrahiert und somit hast du eine Vorstellung davon, obwohl ich dir keine genauen Details nenne. Diese Abstrakte Vorstellung ist eine Klasse.

    Wenn du aber dann eine konkrete Beschreibung ablieferst so redest du von einem ganz konkreten Computer. Etwas ganz konkretes ist ein Objekt.

    Kurz: Eine Klasse beschreibt nur aus was sich ein Objekt zusammensetzt, ist aber nur eine Schablone. Ein Objekt ist eine konkrete Umsetzung einer Klasse, eine sogenannte "Instanz".

    2. Wie kommunizieren Objekte?
    Dies ist deine Frage nach dem Zugriff auf eine Variable eines anderen Objektes (nicht Klasse!). Nehmen wir mal ein ganz lächerliches und völlig weltfremdes Beispiel:

    Das Objekt "GT" der Klasse Person möchte seinen CD-Spieler (Objekt: Konkreter CD Spieler, definiert z.B. durch Marke/Farbe...; Klasse "CDSpieler") anstellen.

    So... damit das klappt musst du den CD-Spieler ja auch kennen. Dir wird es schwerfallen etwas anzustellen das du nicht kennst. In der Objektorientierung gibt es nun mehrere Möglichkeiten es dir bekannt zu geben. Nehmen wir einfach mal an du siehst es:

    [Alles in Pseudo C++ und nicht vollständig]

    CDSpieler DeinCDSpieler;
    Person GT;
    GT.Sehen(DeinCDSpieler);

    Innerhalb der Sehenmethode hast du nun kenntnis von dem CD-Spieler. Nun kannst du dir z.B. in deinem Gedächstnis merken das es diesen gibt (Membervariable) und später diesen Verwenden.

    class Person
    {
      private:
        map<string, BekannteObjekte> listeBekannterObjekte;
      //...
    };
    

    Nun ist es also möglich in einer Methode der Klasse Person etwas damit anzustellen.

    void Person::TueEtwas()
    {
      this->listeBekannterObjekte["MeinCDSpieler"].Starte();
    }
    

    Und du kannst auch werte ablesen, z.B. welcher Titel grade gespielt wird:

    Titel titel = this->listeBekannterObjekte["MeinCDSpieler"].GetAktuellenTitel();

    Da du aber nicht wissen solltest wie der CDSpieler innen arbeitet, kannst du nur wie hier dargestellt über Methoden auf die Werte zugreifen. Du verwendest also die vorgegebene Schnittstelle der Klasse. Du schraubst ja wohl nicht deinen CD-Spieler auf und hantierst mit Strommessern etc. um dies herauszufinden.

    So.... Besser verständlich?

    cu André



  • Wenn ich meinen Code poste würdet ihrs mir vieleicht genau an dem erklären???

    So abstrakt bekomme ich das nicht wirklich hin.

    Schaffe ne Funktion in der 1ten Klasse die den String ausliest. Aber die Funktion dann in die 2te zu bekommen stellt für mich ein unüberwindbares hinderniss da.

    Sorry das ichs nicht versteh... aber Danke für die mühe.

    Wenn ich Code Posten kann und ihr ein bisschen Zeit dafür aufwenden könnt dann sagts...



  • nadann poste mal.



  • OK

    MainWindow.h

    #ifndef _MAINWINDOW_H_
    #define _MAINWINDOW_H_
    #include "Ui_MainWindow.h"
    
    //
    //Class for standart things like: File Open, File Save, File Export
    //
    //And for starting drawing in a QWidget
    //
    class 
    MainWindow : public QMainWindow, protected Ui_MainWindow
    {
    	Q_OBJECT
    
    public:
    
    	MainWindow(QWidget* parent = 0, Qt::WindowFlags flags = 0);
    
    public slots:
    
    ////
    ///Function to draw contents of textedit into that widget
    /// 
    	void slotDrawButtonClicked(void);
    };
    #endif
    

    MainWindow.cpp

    #include <QtGui>
    #include "MainWindow.h"
    #include "ParameterToolWidget.h"
    
    MainWindow :: MainWindow(QWidget* parent /* = 0 */, Qt::WindowFlags flags /* = 0 */) : QMainWindow(parent, flags)
    {
    	setupUi(this);
    
    	slotDrawClearButtonClicked();
    
    	connect(OpenTriggered, SIGNAL(triggered()), this, SLOT(slotTriggeredOpen()));
    
    	connect(SaveTriggered, SIGNAL(triggered()), this, SLOT(slotTriggeredSave()));
    
    	connect(m_pButtonClearTextEdit, SIGNAL(clicked()), m_pTextEdit, SLOT(clear()));
    
    	connect(m_pButtonDraw, SIGNAL(clicked()), this, SLOT(slotDrawButtonClicked()));
    
    	connect(m_pButtonClearTextEdit, SIGNAL(clicked()), this, SLOT(slotDrawClearButtonClicked()));
    
    }
    
    void 
    MainWindow::slotDrawButtonClicked(void)
    {
    	QString sTextEditText = m_pTextEdit->toPlainText();
    
    	QFile file( "temp.txt" );
    
    	if ( !file.open( QFile::WriteOnly ) ) 
    	{
    		return;
    	}
    
    	QTextStream textstream( &file );
    
    	textstream << sTextEditText;
    
    	file.close();
    
    	update();
    
    	m_pParameterToolWidget->repaint();
    
    }
    

    ParameterToolWidget.h

    #ifndef _PARAMETERTOOLWIDGET_H_
    #define _PARAMETERTOOLWIDGET_H_
    #include <QBrush>
    #include <QPen>
    #include <QWidget>
    
    ///
    ///Class to Draw contents of textEdit into a widget
    /// 
    class 
    ParameterToolWidget : public QWidget
    {
    	Q_OBJECT
    
    public:
    
    ///
    ///kommt noch
    /// 
        ParameterToolWidget(QWidget *parent = 0);
    
    protected:
    
    ///
    ///PainEvent to draw into the widget
    /// 
    	void paintEvent(QPaintEvent *event);
    
    private:
    
    ///
    ///To set the pen
    /// 
    	  QPen m_pen;
    
    ///
    ///To set the pen
    ///
        QBrush m_brush;
    
    };
    
    #endif
    

    ParameterToolWidget.cpp

    #include <QtGui>
    #include <QRegExp>
    #include <QWidget>
    #include "MainWindow.h"
    #include "ParameterToolWidget.h"
    
    ParameterToolWidget::ParameterToolWidget(QWidget *parent): QWidget(parent)
    {
    	setBackgroundRole(QPalette::Base);
    
    	setAutoFillBackground(true);
    }
    
    void ParameterToolWidget::paintEvent(QPaintEvent * /* event */)
    {
    
    	QPainter painter(this);
    
    	painter.setPen(m_pen);
    
    	painter.setBrush(m_brush);     
    
    	painter.setRenderHint(QPainter::Antialiasing, true);
    
    	QString sTextTempFile;
    
      QFile TempFile( "temp.txt" );
    
    	TempFile.open(QFile::ReadOnly);
    
    	sTextTempFile = TempFile.readAll();
    
    	sTextTempFile = sTextTempFile.simplified();
    
    	if (sTextTempFile.contains("drawText", Qt::CaseInsensitive))
    	{		
    		sTextTempFile = sTextTempFile.mid(9);
    
    		QStringList list1 = sTextTempFile.split(",", QString::SkipEmptyParts);
    
    		QString xKoordinate = list1[0];
    
    		int xKoordinatezahl = xKoordinate.toInt();
    
    		QString yKoordinate = list1[1];
    
    		int yKoordinateZahl = yKoordinate.toInt();
    
    		QString drawText = list1[2];
    
    		painter.drawText(xKoordinatezahl,yKoordinateZahl,drawText);
    
    		update();
    	}
    
    	if  (sTextTempFile.contains("drawLine", Qt::CaseInsensitive))
    	{
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate1 = list[0];
    
    		int xKoordinatezahl1 = xKoordinate1.toInt();
    
    		QString yKoordinate1 = list[1];
    
    		int yKoordinatezahl1 = yKoordinate1.toInt();
    
    		QString xKoordinate2 = list[2];
    
    		int xKoordinatezahl2 = xKoordinate2.toInt();
    
    		QString yKoordinate2 = list[3];
    
    		int yKoordinatezahl2 = yKoordinate2.toInt();
    
    		painter.drawLine(xKoordinatezahl1,yKoordinatezahl1,xKoordinatezahl2,yKoordinatezahl2);
    
    		update();
    	}
    
    	if  (sTextTempFile.contains("drawEllipse", Qt::CaseInsensitive))
    	{
    
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate1 = list[0];
    
    		int xKoordinatezahl1 = xKoordinate1.toDouble();
    
    		QString yKoordinate1 = list[1];
    
    		int yKoordinatezahl1 = yKoordinate1.toDouble();
    
    		QString xKoordinate2 = list[2];
    
    		int xKoordinatezahl2 = xKoordinate2.toDouble();
    
    		QString yKoordinate2 = list[3];
    
    		int yKoordinatezahl2 = yKoordinate2.toDouble();
    
    		//QRectF rectangle(xKoordinatezahl1, yKoordinatezahl1, xKoordinatezahl2, yKoordinatezahl2);
    
    		QPainter painter(this);
    
    		painter.drawEllipse(xKoordinatezahl1,yKoordinatezahl1,xKoordinatezahl2,yKoordinatezahl2);
    
    		update();
    	}		
    
    	if  (sTextTempFile.contains("drawCircle", Qt::CaseInsensitive))
    	{
    
    		QRegExp rx("(\\d+)");
    
    		QStringList list;
    
    		int pos = 0;
    
    		while ((pos = rx.indexIn(sTextTempFile, pos)) != -1) 
    		{
    			list << rx.cap(1);
    
    			pos += rx.matchedLength();
    		}
    
    		QString xKoordinate = list[0];
    
    		int xKoordinatezahl = xKoordinate.toInt();
    
    		QString yKoordinate = list[1];
    
    		int yKoordinateZahl = yKoordinate.toInt();
    
    		QString Radius = list[2];
    
    		int RadiusZahl = Radius.toInt();
    
    		painter.drawEllipse(xKoordinatezahl - RadiusZahl, yKoordinateZahl - RadiusZahl, RadiusZahl * 2, RadiusZahl * 2);
    
    		update();
    	}		
    
    	if  (sTextTempFile.contains("Segment", Qt::CaseInsensitive))
    	{
    
    		painter.drawEllipse(170 - 170, 170 - 170, 170 * 2, 170 * 2);
    		painter.drawEllipse(170 - 113.33, 170 - 113.33, 113.33 * 2, 113.33 * 2);
    		painter.drawEllipse(340 - 226.66, 340 - 226.66, 56.66 * 2, 56.66 * 2);
    		painter.drawLine(0, 170, 340, 170);
    		painter.drawLine(170, 113.33, 170, 226.66);
    		//painter.drawLine(85, 0, 255, 340);
    		//painter.drawLine(255, 0, 85, 340);
    
    		update();
    	}		
    }
    

    Ja man dürfte ja erkennen das ich es im Moment in einem File zwischen Speicher. Aber wie schon am Anfang gefragt möchte ich das nicht sondern den Inhalt der Variable QString sTextEditText (aus MainWindow.cpp) in ParameterToolWidget.cpp bringen und damit die Temp Datei weglassen. Also der Inhalt von sTextEdit aus MainWindow.cpp soll quasi sTextTempFile aus ParameterToolWidget werden.

    Hoffe das gut erklärt so...



  • GT schrieb:

    OK

    Nichts OK. Leg das verdammte QT-Zeugs weg und lerne die absoluten C++ Grundlagen bevor du dich mit GUI-Design auseinander setzt. Das du in deinen Programm ständig Werte von anderen Objekten veränderst ist dir hoffentlich bewusst (Nein, sonst würdest du ja vielleicht irgendwas verstehen). Ich weiß nicht wie du überhaupt eine QT-Anwendung hinbekommst und sei sie noch so einfach - Obwohl vielleicht ist Kopieren oder Zusammenklicken die richtige Antwort.

    Warum ich überhaupt noch Zeit an jemanden verschwende, der garnicht lernen will, ist eine andere Sache - Weitere Antworten nach dieser kommen nur noch wenn ich sehe das du bereit bist etwas zu lernen, und das bist du bislang nicht (du beschäftigst dich mit Code den du ohne Grundlagen eh nicht verstehst, bist aber auch scheinbar nicht in der Lage dich mal auf eine Grundlegende Einführung C++/Objektorientierung zu stürzen).

    Aber dennoch eine Variante:
    Wenn dein MainWindow eh Zugriff auf das PropertyFenster hat, warum übergibst du nicht den String direkt?

    Auszug aus modifizierter MainWindow.cpp

    ...
    
    void 
    MainWindow::slotDrawButtonClicked(void)
    {
      update();
      m_pParameterToolWidget->SetText(m_pTextEdit->toPlainText());
      m_pParameterToolWidget->repaint();
    }
    

    Auszug aus modifizierter ParameterToolWidget.h

    ...
    class 
    ParameterToolWidget : public QWidget
    {
    	Q_OBJECT
      private:
        QString text;
    
      public:
        void SetText(const QString& text);
    ...
    

    Auszug aus modifizierter ParameterToolWidget.cpp

    void ParameterToolWidget::SetText(const QString& text)
    {
      this->text = text;
    }
    
    void ParameterToolWidget::paintEvent(QPaintEvent * /* event */)
    {
      // Zugriff auf Text nun über text oder this->text
      ...
    

    cu André


Anmelden zum Antworten