Переменная C ++ может быть доступна в конструкторе, но не в функции - PullRequest
0 голосов
/ 21 марта 2012

Итак, я столкнулся с этой странной проблемой, когда у меня есть объект, у которого есть указатель на другой объект, и из этого объекта я хочу получить доступ к переменной. Я могу сделать это в конструкторе, но он не работает, когда я нахожусь в функции.

http://pastebin.com/2FHd7ak0

EDIT:
Переменная 'состояние' блоков, кажется, меняется после того, как я их инициализировал. Сначала выводится 0x3015a8, затем меняется на 0x110000

Edit2: поэтому я сделал небольшой пример, который компилируется, но он дает мне код возврата нарушения доступа. Я явно делаю что-то не так с указателями, но я не могу выяснить, что ... Я пришел с Java, так что это может быть причиной для этого.

http://pastebin.com/uF8t8wx9

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

У вас есть ряд проблем с вашей программой:

  1. В определении Foo::Foo у вас есть это выражение: bar->var.На данный момент в вашей программе введите Bar не является полным.Вы не можете разыменовать указатель на неполный тип.

  2. Вы объявляете два типа с похожими именами: сначала ::Foo::Bar, а затем ::Bar.Я подозреваю, что вы хотели, чтобы они были одного типа.Это не так.

  3. В вашем основном фрагменте кода есть выражение: new Foo(new Bar());.Это не скомпилируется, потому что Foo не имеет конструктора, который принимает Bar*.(У него есть конструктор, который принимает Foo::Bar*, но это другой зверь.)

Примечание : Вы разместили фрагменты какой-то другой программы.Ни одна из перечисленных выше проблем не присутствует в этой другой программе.

В вашей записи pastebin вы никогда не инициализируете StateGame::blockArray.Вы разыменовываете это в stateGame::setBlock.Это приводит к неопределенному поведению.

0 голосов
/ 22 марта 2012

Вы передаете StateGame конструктору Block::Block.Почти наверняка вы затем уничтожите объект StateGame после создания Block s (возможно, StateGame существует в стеке или вы delete d).

0 голосов
/ 22 марта 2012

В любом методе в Foo, Bar не был определен (объявлен только вперед) при определении функции-члена.Таким образом, доступ к Bar::var является незаконным.Если компилятор позволяет вам уйти с этим, это просто удача, но он не обязан этому.

Переместите определение Bar до определения Foo, и все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...