Ожидаемое первичное выражение до * 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.

Другие вопросы по тегам