gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:40:44 25 4
gpt4 key购买 nike

所以我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com