【问题标题】:How to access child class from parent class如何从父类访问子类
【发布时间】:2017-10-12 02:52:33
【问题描述】:

将尝试解释这是最好的方法。我目前正在编写一个解析器,它接受文字,其中文字可以是 Int/Real/String 等...

http://imgur.com/a/YQwlf

上面的链接显示了正在调试的代码部分,然后是当前正在使用的变量。如您所见,“文字”不包含任何内容。它不应该显示 Int Literal 类中的值吗?我还附上了 Literal 和 Int Literal 类文件。

【问题讨论】:

  • “Java”标签是关于什么的?
  • “它不应该显示 Int Literal 类中的值吗?” 不明白为什么。那不在范围内;只有一个指向它的指针。

标签: c++ class oop inheritance


【解决方案1】:

new ASTNodeInt(currToken) 为您提供指向堆上的 ASTNodeInt 的指针,而不是“实际的”ASTNodeInt。您可以通过执行literal->intlit 来尊重指针从中获取值。你的调试器看起来是正确的,它说literal 是一个ASTNodeLiteral *(一个指针),它的值是一个内存地址。

此外,您的代码似乎泄漏了内存 - 您创建了一个新的 ASTNodeInt,然后创建另一个新的并返回它,而不在您创建的原始代码上调用 delete

【讨论】:

  • imgur.com/a/ZIc3b 我无法使用literal->intlit 检索值。这是因为指针指向 ASTLiteral。无论如何它是否会自动指向 ASTNodeInt 以检索值“intlit”?
  • 也许(static_cast<ASTNodeInt*>(literal))->intlit ?对不起,我对 C++ 很生疏。但据我了解,您得到的指针是父类型(NodeFactor *),但您想将其视为指向子类型(NodeInt *)的指针。所以你需要投射。
  • 非常感谢,这成功了!有没有办法可以自动转换到子实例?这是因为我不能简单地告诉将 Literal 转换为什么,因为它可能是多个子类之一。
  • 好吧,你可以完全避免强制转换——你不能只做ASTNodeInt* literal = new ASTNodeInt(currToken)吗?如果你知道你首先想要子类(而且你似乎这样做了,因为你的代码在一个检查这个的 if 语句中),为什么不直接使用它呢?您仍然可以将literal 传递给需要ASTNodeLiteralASTNodeFactor 的函数。显然,这些函数无法访问intlit,除非没有强制转换。
  • 是的,我知道,我很想访问intlit,但这就是为什么我可能需要它来编写未来的代码。无论如何,我会看到当我得到它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多