C ++变量可以在构造函数中访问,但不能在函数中访问

时间:2012-03-21 19:58:37

标签: c++ function variables constructor

所以我遇到了这个奇怪的问题,我有一个对象,它有一个指向另一个对象的指针,以及我想要访问变量的那个对象。我可以在构造函数中执行此操作,但是当我在函数中时它不起作用。

http://pastebin.com/2FHd7ak0

编辑:
在我将它们初始化之后,块的变量“状态”似乎发生了变化。首先它输出0x3015a8,然后它变为0x110000

Edit2:所以我做了一个编译的小例子,但它给了我一个访问冲突返回码。我明显做了一些错误的指针,但我无法找到什么......我来自Java,所以这可能是它的原因。

http://pastebin.com/uF8t8wx9

3 个答案:

答案 0 :(得分:2)

您的示例程序存在许多问题:

  1. Foo::Foo的定义中,您有以下表达式:bar->var。此时,在您的程序中,类型Bar不完整。您不能取消引用指向不完整类型的指针。

  2. 您声明了两个名称相似的类型:第一个::Foo::Bar,然后是::Bar。我怀疑你认为他们是同一类型。他们不是。

  3. 在主代码片段中,您有以下表达式:new Foo(new Bar());。这不会编译,因为Foo没有一个带Bar*的构造函数。 (它确实有一个带Foo::Bar*的构造函数,但这是一个不同的野兽。)

  4. <小时/> 注意:您现在已经发布了其他一些程序的片段。我在上面列出的所有问题都没有出现在这个其他程序中。

    <小时/> 在pastebin entry中,您永远不会初始化StateGame::blockArray。您可以在stateGame::setBlock中取消引用它。这会导致未定义的行为。

答案 1 :(得分:0)

Foo中的任何方法中,Bar在定义成员函数时尚未定义(仅向前声明)。因此,访问Bar::var是非法的。如果编译器允许你使用它,那只是运气,但它没有义务这样做。

Bar的定义之前移动Foo的定义,你没事。

答案 2 :(得分:0)

您将StateGame传递给Block::Block构造函数。几乎可以肯定的是,在构造StateGame之后你可以销毁Block对象(也许StateGame存在于堆栈中,或者delete d)。