写入typdef结构时的C ++访问冲突

时间:2016-07-28 22:17:26

标签: c++

我在头文件中定义了一个结构。然后我有一个单例类,我试图使用该结构。当我从另一个类调用ResetVars()时,当它到达test.numResponses =“TEST”的行时,我会收到访问冲突。我假设这与初始化有关,但我无法解决它。我是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 个答案:

答案 0 :(得分:2)

你被C ++的 Most Vexing Parse 所震惊,这是一个编译器规则,它说任何可能是函数声明功能声明。罪魁祸首是这一行:

POLL_DATA testPoll();

testPoll被视为返回类型为POLL_DATA的函数的声明。尝试删除括号,或简单地编写POLL_DATA testPoll;,它隐式调用编译器生成的默认构造函数。 另一个更大问题是testPollA的成员,但您已隐藏它并在构造函数A::A()中声明了一个局部变量。我建议你完全删除构造函数,因为隐式构造函数就足够了。

有关您的代码的更多说明:

  • 您已宣布自己的班级a,但稍后会将其称为A

  • 您已为A编写了一个构造函数的实现,但未将其声明为正确的前向声明。

此外,C ++中不需要typedef struct。写作是足够和鼓励的:

struct POLLDATA {
    ...
};