Setting a variable in a child classには、多型クラスの変数を正しく引き出す方法を見つけようとしていました。いくつかの助けを借りて、必要な情報に正しくアクセスするためにポインタにdynamic_castを使用する必要があることが分かりました。私はこれにいくつか問題があります。動的キャストを正しく実行する
これは私が現在取り組んでいる機能です。
void translateLines(Parser parser, Code code)
{
while(parser.hasMoreCommands())
{
vector<Command>::const_iterator it = parser.currentCommand();
if(it->commandType() == "A")
{
//SubType* item = dynamic_cast<SubType*>(*the_iterator);
A_COMMAND* a_command = dynamic_cast<A_COMMAND*>(*it); //line that is throwing the error
//string symbol = a_command->get_symbol();
//cout << "symbol: " << symbol << endl;
//perform binary conversion
}
/*else if(command.commandType() == "C")
{
string dest = command.get_dest();
}*/
//shouldn't be any L commands in symbol-less version
else
{
std::cout << "unexpected command value \n";
}
parser.advance();
}
}
これは、ベクトルのイテレータに関する関連情報を持っている私のParser.h、です。ここで
#include "Command.h"
#include <vector>
class Parser {
private:
std::vector<Command> commands;
std::vector<Command>::const_iterator command_it = commands.begin();
public:
Parser(std::vector<std::string>);
bool hasMoreCommands() //are there more commands in the input?
{
if(command_it != commands.end())
return true;
else
return false;
}
void advance(){std::next(command_it);} //move to next command, should only work if hasMoreCommands returns false}
std::vector<Command>::const_iterator currentCommand(){return command_it;}
std::vector<std::string> translateCommands(); //convert commands into binary strings
};
私が受けていますエラーです:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -o Assembler.o "..\\Assembler.cpp"
..\Assembler.cpp: In function 'void translateLines(Parser, Code)':
..\Assembler.cpp:32:55: error: cannot dynamic_cast 'it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<Command*, std::vector<Command> >()' (of type 'class Command') to type 'class A_COMMAND*' (source is not a pointer)
A_COMMAND* a_command = dynamic_cast<A_COMMAND*>(*it);
^
ここで間違っているものを任意の手掛かり?
EDIT:コマンドのベクトルを使用することができないので、コマンドへのポインタが必要です。私は既にvector<Command>
ではなくvector<Command*>
を処理するためにParser.hを変更しました。入力のために私はこのような何か試してみました:
A_COMMAND command();
commands.push_back(&command);
をしかし、これはかなりのベクトルは、ポインタではなく参照を期待しているように、私のために働いていません。メモリへのポインタを作成してベクトルにプッシュする最も簡単な方法は何でしょうか?
エラーメッセージは、 'Command'がクラス名であることを示唆しています。これは、あなたの全体的なアイデアが破滅したことを意味します。あなたのベクトルは派生型のオブジェクトではなく、正確に 'Commands'しか含んでいないので、派生クラスへの' dynamic_cast'は常に失敗します。コンテナに共通の基本クラスを共有する異なる型のオブジェクトを「含む」ようにするには、コンテナはポインタのコンテナでなければなりません –
ありがとう、ありがとう。 – Araganor