所以我正在用 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。
最佳答案
几个选项:
在
Token
中创建一个virtual
成员函数。virtual std::string get_attribute() const = 0;
为
Token
的子类适当实现。用作:Token * testToken = testScanner->next_token(); std::string attr = testToken->get_attribute();
使用
dynamic_cast
从Token*
获取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/