2016-06-12 13 views
0

Ich kann den Fehler nicht in dem folgenden Code herauszufindenErwartete primären Ausdruck vor * 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; 
} 

Der Fehler wird, dass die primäre Ausdruck wird in der Aussage vor * erwartet

if((Fireball *firespell=dynamic_cast<Fireball*>(spell))!=NULL) 

auch

firespell' was not declared in this scope 

Ich denke, 2. Fehler bezieht sich auf den ersten. Ich weiß nicht, welches Konzept mir fehlt. Ich bin diesem Link gefolgt http://en.cppreference.com/w/cpp/language/dynamic_cast

bitte helfen.

Antwort

0

Von if statement:

Zustand [ if (Bedingung) statement_true] eine

  • einer des Ausdrucks, kontextuell umwandelbar ist

  • Deklaration eines einzigen in bool Nicht-Array-Variable mit einem geschweiften oder gleichwertigen Initialisierer.

So können Sie keine Erklärung haben und ein boolean umwandelbar Ausdruck in einer einzigen if Aussage.

Sie haben es zu definieren, bevor if:

Fireball* firespell = dynamic_cast<Fireball*>(spell); 
if (firespell != nullptr) 
    //Do something 
+0

Einige Leser finden es glücklicher als unglücklich.:) – Hurkyl

+0

@Hurkyl Das ist wahr :) – Rakete1111

3
if((Fireball *firespell=dynamic_cast(spell))!=NULL) 

ersetzen durch

if(Fireball *firespell = dynamic_cast<Fireball*>(spell)) 

oder durch

Fireball *firespell; 
if((firespell = dynamic_cast(spell)) != nullptr) 

Auch ich habe keine Ahnung, wie dieses Segment wurde zusammengestellt.

int m = scname.size(); 
    int n = SpellJournal::journal.size(); 
    int L[m+1][n+1]; 

Sie können nicht Array-Größe in Laufzeit verwenden Sie die dynamische Zuordnung (malloc, new) oder einige High-Level-Container

EDIT erklären: Ablesbarkeit Abnahme der 2-nd Codeblock ist umstrittene Aussage.

+0

Es ist eine gute Art der Programmierung, wenn die Variable nur in der Anweisung der if-Anweisung benötigt wird. –

+0

@VladfromMoskau aber es Lesbarkeit zu verringern, so ist dies philosophische Frage und es sieht so aus, dass Variablendefinitionen wie diese Einschränkungen haben – Inline

+0

@Inline, danke für die Hilfe, könnten Sie Ihre Lösung überprüfen, wenn ((Fireball * firespell = dynamic_cast (Zauber)))! = NULL) ,,, Dies ist gegen die erste Lösung, eine Deklaration und einen booleschen konvertierbaren Ausdruck in der if-Anweisung auszuführen. Auch L [m + 1] [n + 1] kompiliert. – BigDataScholar

0

Wenn es ein C++ Programm dann können Sie einfach schreiben

void counterspell(Spell *spell) { 
    if(Fireball *firespell=dynamic_cast<Fireball*>(spell)) 
    { 
    firespell->revealFirepower(); 

} 

Der ursprüngliche Code wird nicht kompiliert, da eine Erklärung ein Operand eines Ausdrucks in der if-Anweisung ist.