C++ pointer to incomplete class type

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
327
hallo, folgendes Problem:

Code:
#ifndef A_H
#define A_H

#include "blub.h"

class A{
	public:
		A(char* name, Blub* blub);
		virtual ~A();
		virtual void update();
		Blub* blub;
	private:
		A();
		A& operator=(const A& other);
};

#endif

Code:
#ifndef B_H
#define B_H

#include "A.h"

class B : public A{
public:
	B(Blub* blub);
       ~B();
	void update() override;
};

#endif

In der Klasse B kann ich keine funktionen von blub aufrufen, "pointer to incomplete class type not allowed".
In Klasse A funktioniert es allerdings ohne probleme. Kann mir jemand sagen, woran das liegt bzw wie ich das beheben kann?
 
Nur weil Klasse B von A abegeleitet ist, sagt das dem Compiler noch lange nicht, was genau die Klasse Blub ist, die verwendet wird.
 
striker159 schrieb:
In der Klasse B kann ich keine funktionen von blub aufrufen, "pointer to incomplete class type not allowed".
Das sollst du doch auch nicht im Header. Oder kompiliert der Code so wie du ihn gepostet hast auch nicht? Also ohne Funktionsaufruf?
 
Kannst du die Stelle im Code zeigen, die den Fehler produziert? Und die Deklaration von Blub (Blub.h) wäre auch hilfreich.
 
@3murmeln: Aber B.h inkludiert A.h, und A.h inkludiert blub.h.

@striker159: In deinem Beispiel solltest du wahrscheinlich besser Blub forward-deklarieren, und nicht blub.h includen. Der #include kommt dann in A.cpp.
Raw-pointer solltest du besser auch nicht benutzen (ausser du arbeitest mit low-level resourcen) - besser std::unique_ptr/std::shared_ptr.
Oder noch besser: Blub stack-alloziieren! (also ohne pointer). (falls es kein polymorpher Typ ist).

Edit: Und statt den default c'tor und copy c'tor private zu deklarieren, besser
public:
A() = delete;
A& operator=(const A& other) = delete;
 
Zuletzt bearbeitet:
oh man, das war ein doofer fehler von mir.
ich habe in B.cpp ein weiteres include vergessen, welches in A.cpp drin steht. deshalb hat es in A geklappt und in B nicht ._.

= delete und die neuen pointer werde ich mir mal ansehen. kannte ich bisher noch nicht, da ich eher weniger c++ programmiere.
 

Ähnliche Themen

Zurück
Oben