C++方法返回指向抽象类的指针,需要使用子类中的方法

标签 c++ compiler-construction abstract-class

所以我正在用 C++ 编写一个编译器。目前在扫描仪部分。

scanner内部的方法声明是

Token * Scanner::next_token()
{
  string * test = new string("Test");
  IdToken * testToken = new IdToken(test);
  return testToken;  
}

IdToken 类有一个方法 get_attribute() 返回私有(private)变量 attr 的值(在本例中是一个字符串,在创建时传入)。 Token(抽象类)没有这个方法。

在我的主要测试中,我有这个:

IdToken * testToken = testScanner->next_token();

但是 g++ 不喜欢那样,并说这是从 Token* 到 IdToken* 的无效转换。

我需要将方法返回的 token 转换为 IdToken 以获取属性,因为当我尝试直接调用返回的 token 上的 get_attribute() 时,它告诉我 Token::get_attribute() 不存在.

完全不确定如何解决这个问题,因为我对 C++ 继承等的了解很困难。我做了我能做的所有研究,但找不到任何我既理解又能解决我的问题的东西。

这里是Scanner.cc

Scanner::Scanner (char * filename)
{
  buf = new Buffer(filename);
}

//Destroy new things
Scanner::~Scanner()
{
  delete buf;
}

//The huge DFA turned into code
Token * Scanner::next_token()
{
  string * test = new string("Test");
  IdToken * testToken = new IdToken(test);
  return testToken;
}

这是 IdToken.cc

IdToken::IdToken() : Token()
{
  set_token_type (TOKEN_ID);
  attribute = new string("UNINITIALIZED IDENTIFIER ATTRIBUTE");
}

IdToken::IdToken (string *attr) : Token()
{
  set_token_type (TOKEN_ID);
  attribute = new string(*attr);
}

IdToken::~IdToken()
{  if (attribute != NULL) {
    delete attribute;
  }
}


string *IdToken::get_attribute() const
{
  string *attr = new string(*attribute);
  return attr;
}


void IdToken::set_attribute(string *attr)
{ 
  if (attribute != NULL) {
    delete attribute;
  }
  attribute = new string (*attr);
}


string *IdToken::to_string()
{
  string *attribute_name = new string ("ID:" + *attribute);
  return attribute_name;
}    

最后是token.cc

#include "token.h"

Token::Token()
{
  type = TOKEN_NO_TYPE;
}

Token::~Token()
{}

void Token::set_token_type (token_type_type type)
{
  this->type = type;
}

token_type_type Token::get_token_type() const
{
  return type;
}

这还没有完成,我只是需要帮助弄清楚如何访问 get_attribute。

最佳答案

几个选项:

  1. Token中创建一个virtual成员函数。

    virtual std::string get_attribute() const = 0;
    

    Token的子类适当实现。用作:

    Token * testToken = testScanner->next_token();
    std::string attr = testToken->get_attribute();
    
  2. 使用dynamic_castToken* 获取IdToken*。如果转换成功,调用 get_attribute()。在 IdToken* 上。

    Token * testToken = testScanner->next_token();
    IdToken * testIdToken = dynamic_cast<IdToken*>(testToken);
    if ( testIdToken )
    {
       std::string attr = testIdToken->get_attribute();
    }
    

关于C++方法返回指向抽象类的指针,需要使用子类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026856/

相关文章:

c++ - 在 C++/Win7 中访问 COM 设备名称

C++:使用 vector/数组优化速度?

c - 实现 C 预处理器

compiler-construction - 构建您自己的可以作为编译器的解释器

c++ - 构造函数中抽象类的默认值

java - 抽象基 bean 类

c++ - 用于 GPU 上的瓦片度量和调度的 Halide

c++ - 变量模板的部分特化

compiler-construction - SICP最后两章的简短解释

c# - 哪种设计最适合这种情况?