Ожидаемое первичное выражение до * C++
Я не могу понять ошибку в следующем коде
#include <iostream>
#include <vector>
using namespace std;
class Spell {
private:
string scrollName;
public:
Spell(): scrollName("") { }
Spell(string name): scrollName(name) { }
virtual ~Spell() { }
string revealScrollName() {
return scrollName;
}
};
class Fireball : public Spell {
private: int power;
public:
Fireball(int power): power(power) { }
void revealFirepower(){
cout << "Fireball: " << power << endl;
}
};
class SpellJournal {
public:
static string journal;
static string read() {
return journal;
}
};
string SpellJournal::journal = "";
void counterspell(Spell *spell) {
if((Fireball *firespell=dynamic_cast<Fireball*>(spell))!=NULL)
{
firespell->revealFirepower();
}
else
{
string scname=spell->revealScrollName();
int m = scname.size();
int n = SpellJournal::journal.size();
int L[m+1][n+1];
for(int i=0; i<=m; i++)
{
for(int j=0; j<=n; j++)
{
if(i==0 || j==0)
L[i][j] = 0;
else if(scname[i-1]==SpellJournal::journal[j-1])
L[i][j] = L[i-1][j-1]+1;
else
L[i][j] = max(L[i-1][j],L[i][j-1]);
}
}
cout<<L[m][n];
}
}
class Wizard {
public:
Spell *cast() {
Spell *spell;
string s; cin >> s;
int power; cin >> power;
if(s == "fire") {
spell = new Fireball(power);
}
else {
spell = new Spell(s);
cin >> SpellJournal::journal;
}
return spell;
}
};
int main() {
int T;
cin >> T;
Wizard Arawn;
while(T--) {
Spell *spell = Arawn.cast();
counterspell(spell);
}
return 0;
}
Ошибка в том, что первичное выражение ожидается перед * в операторе
if((Fireball *firespell=dynamic_cast<Fireball*>(spell))!=NULL)
также
firespell' was not declared in this scope
Я думаю, что вторая ошибка связана с первой. Я не знаю, какую концепцию мне не хватает. Я перешел по этой ссылке http://en.cppreference.com/w/cpp/language/dynamic_cast
любезно помогите.
3 ответа
От if
утверждение:
Условие [if (условие) Statement_true] один из
одно из выражений, которое контекстуально конвертируется в bool
объявление одной переменной, не являющейся массивом, с инициализатором в скобках или равно.
Таким образом, вы не можете иметь объявление и логическое преобразовываемое выражение в одном if
заявление.
Вы должны определить это раньше if
:
Fireball* firespell = dynamic_cast<Fireball*>(spell);
if (firespell != nullptr)
//Do something
if((Fireball *firespell=dynamic_cast(spell))!=NULL)
заменить на
if(Fireball *firespell = dynamic_cast<Fireball*>(spell))
или
Fireball *firespell;
if( ( firespell = dynamic_cast(spell) ) != nullptr)
Кроме того, я не знаю, как этот сегмент был скомпилирован.
int m = scname.size();
int n = SpellJournal::journal.size();
int L[m+1][n+1];
Вы не можете объявить размер массива во время выполнения, используйте динамическое размещение (malloc
, new
) или несколько контейнеров высокого уровня
РЕДАКТИРОВАТЬ: снижение читаемости во 2-м блоке кода является спорным утверждением.
Если это программа на C++, то вы можете просто написать
void counterspell(Spell *spell) {
if( Fireball *firespell=dynamic_cast<Fireball*>(spell) )
{
firespell->revealFirepower();
}
Исходный код не скомпилирован, потому что объявление является операндом выражения в операторе if.