2016-04-26 4 views
2

Я пытаюсь создать указатель на класс следующим образом.C++ присвоение объекта другому классу

ASTNode* pAssign = new ASTAssignmentNode(); 

Однако pAssign не состоит из переменных, определенных в классе ASTAssignmentNode. Я что-то пропустил? Как я могу получить доступ к переменным, указанным в ASTAssignmentNode()? ASTAssignmentNode() унаследовал от ASTStatementNode() который наследует от ASTNode().

При написании pAssign->variable (который объявлен в ASTAssignmentNode()) возникает ошибка «pAssign не содержит определение для переменной-члена»

Я не опытный в C++.

бы признателен за любую помощь.

+1

Присвоить его указателю на 'ASTAssignmentNode'. –

+2

Если вы хотите использовать 'ASTAssignmentNode', то почему у вас есть указатель на базовый класс? –

ответ

1

Вместо этого вы должны использовать ASTAssignmentNode * pAssign. Если вы делаете это для назначения класса, и они дают вам файлы, вы не должны модифицировать, что заставляет вас использовать ASTNode *, спросите свою TA об этом, потому что я был в этой ситуации и должны быть обходные пути, которые вы можете использовать, но это wi будут отличаться от разных заданий.

+0

Спасибо за понимание моей ситуации. Я проверю соответственно. – Techworld

1

Try отливка для доступа к переменным, принадлежащие к классу ASTAssignmentNode

((ASTAssignmentNode* ) pAssign)->variable 

То, что я использовал называется регулярным литая. Вы также можете использовать статический литой или динамический бросок, упомянутый M.M. Если вам нужна подробная разбивка того типа, который вам нужен, проверьте post here.

До тех пор, пока вы уверены, что ASTAssignmentNode является дочерним по ASTNode, не должно быть никаких последствий.

Когда вы вводите ASTAssignmentNode в ASTNode, он будет содержать только определение класса для ASTNode и ничего не знает об ASTAssignmentNode. Вот почему вам нужно вернуть его обратно.

Исключением являются виртуальные функции. Виртуальные функции вызывают реализацию дочернего класса, если они существуют.

+0

Это сработало. Не могли бы вы объяснить, могут ли быть последствия, если я буду использовать это? – Techworld

+0

Это должно быть 'dynamic_cast' или' static_cast' (желательно первое, если вы действительно не знаете, что делаете) –

+0

Отредактировано для включения краткого объяснения – Striker

0

Поскольку pAssign является указателем на базовый класс, вам нужно будет передать его производному классу ASTAssignmentNode. Предпочтительно с C++ dynamic_cast.

dynamic_cast<ASTAssignmentNode*>(pAssign)->variable 
+0

Спасибо, что помогло! :) – Techworld

+0

если вы представляете dynamic_cast кому-то, укажите, что он может вернуть значение null – kfsone

Смежные вопросы