所以我正在用C++編寫一個編譯器。目前在掃描儀部分。C++方法返回指向抽象類的指針,需要使用子類中的方法
掃描儀內的方法聲明是
Token * Scanner::next_token()
{
string * test = new string("Test");
IdToken * testToken = new IdToken(test);
return testToken;
}
的IdToken類有一個方法get_attribute()返回私有變量ATTR(在這種情況下是一個字符串的值,所述一個傳遞在創建)。令牌(抽象類)沒有這種方法。
裏面的主我的測試中我有這樣的:
IdToken * testToken = testScanner->next_token();
但G ++不喜歡這一點,說,這是從令牌*至* IdToken一個無效的轉換。
我需要將該方法返回的標記轉換爲IdToken以獲取屬性,因爲當我嘗試直接調用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。
自從我和編譯器一起工作以來,我提出了一個很好的建議...爲什麼不先學習C++和**然後嘗試編寫玩具編譯器?而對於這裏發佈的問題IdToken和令牌代碼可以極大地幫助 – 2014-09-24 21:32:02
我會相應地編輯。這是一個班級。我很瞭解C++,但是我沒有處理任何與繼承有關的事情,當然也不是這個功能。 我將編輯帖子並添加代碼。 – Neal 2014-09-24 21:33:48
我同意Marco的意見。但是,我不清楚爲什麼你需要知道那是什麼樣的標記。答案是要麼不關心它在這個時候是什麼類型的標記,要麼可能使用'dynamic_cast'(或者如果你使用'llvm'作爲後端的''llvm :: dyn_cast') – 2014-09-24 21:38:20