我在头文件中定义了一个结构。然后我有一个单例类,我试图使用该结构。当我从另一个类调用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();
答案 0 :(得分:2)
你被C ++的 Most Vexing Parse 所震惊,这是一个编译器规则,它说任何可能是函数声明的功能声明。罪魁祸首是这一行:
POLL_DATA testPoll();
testPoll被视为返回类型为POLL_DATA
的函数的声明。尝试删除括号,或简单地编写POLL_DATA testPoll;
,它隐式调用编译器生成的默认构造函数。
另一个更大问题是testPoll
是A
的成员,但您已隐藏它并在构造函数A::A()
中声明了一个局部变量。我建议你完全删除构造函数,因为隐式构造函数就足够了。
有关您的代码的更多说明:
您已宣布自己的班级a
,但稍后会将其称为A
。
您已为A
编写了一个构造函数的实现,但未将其声明为正确的前向声明。
此外,C ++中不需要typedef struct
。写作是足够和鼓励的:
struct POLLDATA {
...
};