it-swarm.com.de

C ++ - Variable hat Initialisierer, aber unvollständigen Typ?

Ich versuche, 2 Klassen in C++ mit dem folgenden Befehl zu kompilieren:

g++ Cat.cpp Cat_main.cpp -o Cat

Ich erhalte aber folgenden Fehler:

Cat_main.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type

Könnte mir jemand erklären, was das bedeutet? Meine Dateien erstellen im Grunde genommen eine Klasse (Cat.cpp) und erstelle eine Instanz (Cat_main.cpp). Hier ist mein Quellcode:

Cat.cpp:

#include <iostream>
#include <string>

class Cat;

using namespace std;

int main()
{
    Cat Joey("Joey");
    Joey.Meow();

    return 0;
}

Cat_main.cpp:

#include <iostream>
#include <string>

using namespace std;

class Cat
{
    public:
        Cat(string str);
    // Variables
        string name;
    // Functions
        void Meow();
};

Cat::Cat(string str)
{
    this->name = str;
}

void Cat::Meow()
{
    cout << "Meow!" << endl;
    return;
}
46
user569322

Sie verwenden eine Forward-Deklaration, wenn Sie einen vollständigen Typ benötigen.

Sie müssen eine vollständige Definition der Klasse haben, um sie verwenden zu können.

Die übliche Vorgehensweise ist:

1) erstelle eine Datei Cat_main.h

2) bewegen

#include <string>

class Cat
{
    public:
        Cat(std::string str);
    // Variables
        std::string name;
    // Functions
        void Meow();
};

zu Cat_main.h. Beachten Sie, dass ich im Header using namespace std; Entfernt und die Zeichenfolge mit std::string Qualifiziert habe.

3) Fügen Sie diese Datei sowohl in Cat_main.cpp Als auch in Cat.cpp Ein:

#include "Cat_main.h"
42
Luchian Grigore

Es hängt nicht direkt mit Kens Fall zusammen, aber ein solcher Fehler kann auch auftreten, wenn Sie die Datei . H kopiert und vergessen haben, sie zu ändern #ifndef Richtlinie. In diesem Fall überspringt der Compiler nur die Definition der Klasse und denkt, dass es sich um eine Duplikation handelt.

9

Sie können keine Variable eines unvollständigen Typs definieren. Sie müssen die gesamte Definition von Cat in den Gültigkeitsbereich bringen bevor Sie können die lokale Variable in main erstellen. Ich empfehle, dass Sie die Definition des Typs Cat in eine Kopfzeile verschieben und sie aus der Übersetzungseinheit mit main einfügen.

Bei der Suche nach der Lösung ist ein ähnlicher Fehler aufgetreten.

Mit Qt kann dieser Fehler auftreten, wenn Sie vergessen, den Schritt QT_WRAP_CPP( ... ) in Ihrem Build hinzuzufügen, um den Meta Object Compiler (moc) auszuführen. Die Angabe des Qt-Headers ist nicht ausreichend.

1
peter karasev

Manchmal, der gleiche Fehler tritt auf, wenn Sie forget to include the corresponding header.

0
xtluo