2017-01-25 4 views
-1

Ich habe Probleme mit der Forward-Deklaration.Forward-Deklaration und Cast unvollständiger Typ C++

namespace downloader { 
class IHttpThreadCallback ; 
class MemoryHttpRequest ; 

}

wenn ich werfe

auto responseHttpRequest = dynamic_cast<downloader::MemoryHttpRequest*>(m_callback); 

zeigen Sie unvollständigen Typ warnen. Wie soll ich es versuchen, bitte schlage es mir vor.

neben dem ich versuche, Klasse zu integrieren, aber es funktioniert nicht, und ich denke, es ist keine gute Idee. Vielen Dank

+1

Sie müssen die Klassendefinition enthalten. –

+0

Vorwärtsdeklarationen von Klassen und Strukturen sagen dem Compiler nur, dass die Klasse oder Struktur existiert, aber um die Klasse oder Struktur zu verwenden, benötigen Sie die vollständige Definition. –

+1

Warum denkst du, dass das Einbeziehen der Klasse eine schlechte Idee ist? (Und was hat nicht funktioniert)? – doctorlove

Antwort

2

Es zeigt Warnung unvollständiger Typ. Wie soll ich es versuchen, bitte schlage es mir vor.

Um dynamic_cast zu verwenden, muss der Typ vollständig sein. Lösung: Enthalten Sie die Definition.

abgesehen davon versuche ich Klasse zu integrieren, aber es funktioniert nicht und ich denke, es ist keine gute Idee.

Einschließlich der Klassendefinition ist nicht nur eine gute Idee, sondern obligatorisch, wenn Sie dynamic_cast verwenden müssen. In diesem Fall ist die Verwendung einer Forward-Deklaration keine Lösung für Ihr Problem.

in meiner Situation, die Klasse, die ich brauche, ist in CPP-Datei definiert

In diesem Fall können Sie nicht in diese Art niedergeschlagenen - es sei denn, Sie die Klassendefinition in einen Kopf zu bewegen, die Sie umfassen .

+0

Die Antwort ist so klar, in meiner Situation muss ich den aktuellen Quellcode pflegen. Sie verwenden Forward-Deklaration für diesen Fall.Danke dir –

1

dynamic_cast verwendet die vtable zum Abfragen und Navigieren in der Klassenhierarchie. es muss auch den Klasseninhalt/das Layout kennen, um Offsets zu berechnen. Aus diesem Grund muss der Compiler die Klassendefinition kennen. static_cast muss eine Beziehung zwischen den Klassen haben.

Wenn Sie sich über den Rückgabewert sicher sind und gerne die Laufzeit-/Typprüfung vermeiden, sollten Sie einen reinterpret_cast verwenden.

Andernfalls müssen Sie die Definition hinzufügen.

Ich habe ein Beispiel zusammen

#include <iostream> 
#include <vector> 
#include <iostream> 

namespace n { 
    class A; 
    class B; 

    n::A* f(); 
} 

std::ostream& operator<<(std::ostream& os, n::A& a); 
std::ostream& operator<<(std::ostream& os, n::B& b); 

int main() 
{ 
    n::A* a(n::f()); 
    n::B* b=reinterpret_cast<n::B*>(n::f()); 

    std::cerr << "a: " << *a << std::endl; 
    std::cerr << "b: " << *b << std::endl; 
} 

namespace n { 
    class A 
    {}; 

    class B: public A 
    {}; 

    n::A* f() { 
    return new A(); 
    } 
} 

std::ostream& operator<<(std::ostream& os, n::A& a) { 
    os << "in A"; 
    return os; 
} 

std::ostream& operator<<(std::ostream& os, n::B& b) { 
    os << "in B"; 
    return os; 
} 
+1

Statische Downcasting erfordert auch die Definition. – user2079303

+0

@ user2079303 tatsächlich. werde Dich auf dem Laufenden halten – ccpgh

Verwandte Themen