2016-07-28 13 views
-5

ヘッダファイルに構造体が定義されています。次に、構造体を使用しようとしているシングルトンクラスを持っています。別のクラスからResetVars()を呼び出すと、test.numResponses = "TEST"という行にヒットしたときにアクセス違反が発生します。私はこれが初期化と関係があると仮定していますが、私はそれを解決することができませんでした。私はC++を初めて使っているので、これを回避する方法はわかりません。助けてくれてありがとう。typdefへの書き込み時にC++アクセス違反が発生する

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

[MCVE] – Slava

+3

はなぜあなたが最初の場所で 'typedefをstruct'でC++が必要なのですか含むようにあなたの質問を編集してください? – Slava

+0

クラスA.hにはstruct.h – baruti

答えて

2

あなたはC++の打撃を受けていますほとんどのVexing Parseは、関数宣言である可能性のある何かを言うコンパイラルールは、関数宣言のです。犯人は、この行である:

POLL_DATA testPoll(); 

testPollは、リターンタイプPOLL_DATAと関数の宣言として扱われます。角かっこを削除するか、暗黙的にコンパイラ生成のデフォルトコンストラクタを呼び出すPOLL_DATA testPoll;を書くだけです。 もう1つの問題はAのメンバーですが、あなたはそれを隠して、コンストラクタのローカル変数であるA::A()を宣言しました。暗黙のコンストラクタで十分であるため、コンストラクタを完全に削除することをお勧めします。あなたのコードの

いくつかのより多くのノート:

  • あなたのクラスaを宣言したが、Aとして、後でそれを参照してくださいました。

  • 正しい前方宣言のように宣言することなく、Aのコンストラクタの実装を作成しました。

また、typedef structはC++では不要です。それは十分であり、作成することをお勧め:

struct POLLDATA { 
    ... 
}; 
+0

'POLL_DATA'は(コンパイラによって生成された)デフォルトのコンストラクタを持っているので、ctor初期化子リストまたはコンストラクタの本体で明示的に初期化する必要はありません。 'POLL_DATA testPoll = POLL_DATA()。'はローカルを作成し、オブジェクトのメンバーのインスタンス化には影響しません。また、私はOPによって曖昧に言及された問題をこれが修正するという兆候は見られません。では、OPが含まれていないというエラーをどのように修正しますか? –

+0

あなたのコメント(当然のことながら、私の恩赦)として編集され、他のエラーを書き留めました。 –

+0

@TimStraubingerまあ、それはさらに悪いようだ。 'POLL_DATA testPoll;'でも意味がありますか? –

関連する問題