【问题标题】:Can't Instantiate Object in Constructor无法在构造函数中实例化对象
【发布时间】:2012-12-08 00:29:45
【问题描述】:

我有一个像这样的 C++ 头文件:

class someClass : public someBaseClass
{
public:
    someClass();
    ~someClass();

private:
    Text playText; //declare text object
};

它的 C++ 源文件是:

someClass::someClass() : playText("Play") //instantiate text object
{
}

someClass::~someClass()
{
}

然后我有另一个类,它有一个静态成员 someClass:

class anotherClass
{
public:
    anotherClass();
    ~anotherClass();
private:
    static someClass className; //declare someClass object
};

对应的C++源文件:

anotherClass::anotherClass()
{
}

anotherClass::~anotherClass()
{
}

someClass anotherClass::className; //must do because its static

我的问题是,当我关闭我的应用程序时,我收到一条错误消息:

Unhandled exception at 0x6903a9e0 in Breakout.exe: 0xC0000005: Access violation reading location 0x00000054.

但奇怪的是,当我在 someClass 构造函数中注释掉我的代码的 : playText("Play") 部分时,消息消失了。我基本上无法实例化playText,否则我会收到错误(仅当我在运行时从不关闭应用程序时)。

我完全糊涂了,找不到任何关于为什么会发生这种情况的信息,所以有人知道为什么会发生这种情况以及我该如何解决吗?

谢谢。

【问题讨论】:

  • class 是一个关键字。将成员重命名为其他名称。
  • 除了class 是一个关键字这个明显的问题(并且在这里使用可能只是为了演示目的?),我第一眼看不出一个严重的问题。我认为,问题出在实际构造函数中的一些分配细节,也许是someBaseClass 之一?请注意,静态初始化在输入main() 之前运行,并且初始化不同静态对象的顺序未确定。所以,如果你有多个这样的对象并且它们甚至相互引用,请注意......
  • 请发Text类的代码。
  • 你的例子确实没有给我们任何有用的信息。考虑到您说注释掉 playText 的初始化会导致行为发生变化。您不认为向我们展示Text 或至少是相关的Text::Text 有助于追踪问题吗?
  • 在调试器下运行代码。否则,请发布足够的代码,以便人们可以编译、运行它并复制您的错误。 someBaseClass 有虚拟析构函数吗?您的anotherClass 实例是如何销毁的?

标签: c++ object static instantiation


【解决方案1】:

class 是保留关键字。您不能在这里将其用作标识符:

static someClass class;

您必须为静态成员变量使用另一个名称。我很惊讶这甚至可以编译。

【讨论】:

  • 其实这不是问题。我只是将这个名字用于演示目的,因为它是我脑海中突然出现的第一个名字。
  • @ProgrammerGuy123 那么您发布的代码是正确的。如果有错误,那肯定不是该代码的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
相关资源
最近更新 更多