pointer als globale Variable speichern

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Chri
Beiträge: 74
Registriert: 23. Juni 2017 12:32

pointer als globale Variable speichern

Beitrag von Chri » 24. Mai 2018 13:06

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

hilefoks
Beiträge: 136
Registriert: 13. März 2008 17:09

Re: pointer als globale Variable speichern

Beitrag von hilefoks » 7. Juni 2018 14:46

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

Antworten