Seite 1 von 1

pointer als globale Variable speichern

Verfasst: 24. Mai 2018 13:06
von Chri
Hi

Habe eine Klasse Parameter, deren Aufgabe es ist, die Variablen a und b anderen Klassen zur Verfügung zu stellen:
Andere Klassen sollen a, b verändern bzw. auslesen.

Code: Alles auswählen

class Parameter
{
public:
    Parameter();
    double a = 2, b=3;
};
Es funktioniert das:
In mainwindow.cpp rufe ich eine Instanz auf: Parameter par ;
und rufe eine Instanz einer anderen Klasse auf, der als Argument der pointer mitgegeben wird: Klasse1 *Kl1 = new Klasse1(par);
In Kl1 kann ich auf auf a, b zugreifen: z.B. ui->doubleSpinBox_b->setValue(z.b); (Wobei z der pointer ist)

Nun möchte ich den pointer in einer globalen Variablen speichern, sodass jede Klasse auf par zugreifen kann:, und daran scheitere ich tw. :
in mainwindow.h die globale Variable: extern Parameter *globpoint ;
in mainwindow.cpp: globpoint = ∥
in klasse1.h : #include "parameter.h"
in Klasse1.cpp: qDebug()<<"glopointer KL1"<<*&globpoint->b; und das funktioniert. ABER:

Es funktioniert nicht:
Habe noch eine Klasse2 (ohne Argumente) , in der ansonsten dasselbe steht wie in Klasse 1, und dort funktioniert es nicht. (Bekomme irgendeinen zufälligen Wert)
qDebug()<<"glopointr KL2"<<globpoint; liefert zwar den selben Pointer wie par
qDebug()<<"glopointr KL2"<<*&globpoint->b; liefert jedoch irgendeinen zufälligen Wert.

Während ich das geschrieben habe, habe ich herausgefunden:
Klasse2 *Kl2 = new Klasse2(); funktioniert, wenn es innerhalb des Codes von MainWindow::MainWindow(QWidget *parent) : .... aufgerufen wird.
nicht jedoch, wenn es über einen Pushbutton von mainwindow aufgerufen wird. Und für Klasse 1 ebenso.

???

Soll keine Diskussion über bad style - globale Variable sein.

LG
Chri

Re: pointer als globale Variable speichern

Verfasst: 7. Juni 2018 14:46
von hilefoks
Moin,

so ganz verstehe ich deinen Code nicht. Vielleicht hilft dir ein einfaches Singleton aber weiter. Ist zwar auch kein guter Stil, aber besser als globale Variablen ist es allemal. Also:

Code: Alles auswählen

class Parameter
{
private:
    Parameter();

public:    
    static Parameter& instance() {
    	static Parameter _instance;
    	return _instance;
    }
    
    double a = 2, b=3;
};
Damit kannst du von überall auf die eine Instanz von Parameter zugreifen:

Code: Alles auswählen

qDebug() << Parameter::instance().a;
MfG
Hilefoks