2016-07-28 13 views
-5

Ich habe eine Struktur in einer Header-Datei definiert. Dann habe ich eine Singleton-Klasse, in der ich versuche, die Struktur zu verwenden. Wenn ich ResetVars() von einer anderen Klasse aufrufen, erhalte ich eine Zugriffsverletzung, wenn es die Zeile trifft, die test.numResponses = "TEST" angibt. Ich gehe davon aus, dass dies etwas mit Initialisierung zu tun hat, aber ich konnte es nicht lösen. Ich bin neu in C++ und ich habe keine Ahnung, wie ich das umgehen soll. Danke für jede Hilfe.C++ Zugriffsverletzung beim Schreiben in typdef Struktur

struct.h

typedef struct POLL_DATA 
{ 
    std::string numResponses; 
    std::string type; 
    std::string question; 
} POLL_DATA; 

ControlPolls.h

class ControlPolls 

{ 
    private: 
     static bool instanceFlag; 
     static ControlExitPolls *controlSingle; 
     ControlExitPolls(); 

     POLL_DATA test; 
    public: 

     static ControlExitPolls* getInstance(); 
     void ResetVars(); 
}; 

ControlPolls.cpp

#include "ControlPolls.h" 

bool ControlPolls::instanceFlag = false; 
ControlPolls* ControlPolls::controlSingle = NULL; 

//Private Constructor 
ControlExitPolls::ControlExitPolls() 
{ 
}; 

//Get instance 
ControlPolls* ControlPolls::getInstance() 

{ 
    if(!instanceFlag) 

    { 
     controlSingle = &ControlPolls(); 
     instanceFlag = true; 
     return controlSingle; 
    } 

    else 

    { 
     return controlSingle; 
    } 
} 

void ControlExitPolls::ResetVars() 
{ 

     test.numResponses = "TEST"; 
} 

callingClass.cpp

ControlPolls *controlSingleton; 
controlSingleton = ControlPolls::getInstance(); 
controlSingleton->getInstance()->ResetVars(); 
+1

Bearbeiten Sie Ihre Frage ein enthalten [MCVE] – Slava

+3

Warum brauchen Sie 'typedef struct' in C++ in erster Linie? – Slava

+0

Klasse A.h enthält struct.h – baruti

Antwort

2

Sie wurden von C++ Most Vexing Parse, eine Compiler-Regel, die alles, was eine Funktion Erklärung eine Funktionsdeklaration sein könnte. Schuld daran ist diese Zeile:

POLL_DATA testPoll(); 

testPoll als Erklärung einer Funktion mit Rückgabetyp POLL_DATA behandelt wird. Versuchen Sie, die Klammern zu entfernen, oder schreiben Sie einfach POLL_DATA testPoll;, was implizit den vom Compiler erzeugten Standardkonstruktor aufruft. Ein weiterer größer Problem ist, dass testPoll ein Mitglied von A ist, aber Sie haben es ausgeblendet und eine lokale Variable in Ihrem Konstruktor, A::A() deklariert. Ich schlage vor, Sie entfernen den Konstruktor zusammen, weil der implizite Konstruktor ausreichen wird.

Einige weitere Hinweise zu Ihrem Code:

  • Sie haben Ihre Klasse a erklärte aber später als A darauf verweisen.

  • Sie haben eine Implementierung eines Konstruktors für A geschrieben, ohne sie wie eine ordnungsgemäße Forward-Deklaration zu deklarieren.

Auch typedef struct wird in C++ nicht benötigt. Es genügt, und zu schreiben ermutigt:

struct POLLDATA { 
    ... 
}; 
+0

Da 'POLL_DATA' einen Standardkonstruktor hat (vom Compiler generiert), muss er nicht explizit in der Ctor-Initialisiererliste oder im Hauptteil des Konstruktors initialisiert werden. 'POLL_DATA testPoll = POLL_DATA().'wird eine lokale erstellen und hat keine Auswirkungen auf die Instanziierung der Mitglieder des Objekts. Ich sehe auch keinen Hinweis darauf, dass damit das Problem behoben wird, auf das das OP vage hingewiesen hat. Also, wie behebt dies den Fehler, den das OP nicht zu berücksichtigen pflegte? –

+0

Bearbeitet nach Ihrem Kommentar (was offensichtlich ist, mein Entschuldigung) und notierte andere Fehler. –

+0

@TimStraubinger Nun, es sieht noch schlimmer aus. Würde 'POLL_DATA testPoll;' überhaupt Sinn machen ?? –