einfacher Vererbungssyntax kompiliert nicht
-
Hallo,
Mir ist kein besserer Titel eingefallen - ich lerne gerade C++ und will dynamisches Binden ausprobieren in der
compare(Namespace* a, Namespace* b)
Methode. Zugegeben ist es komisch, dass sie an ein Objekt gebunden ist aber ich will nur sehen, wie dynamisches binden bei zwei Objekten unterschiedlicher Vererbungsstufe hier passiert.
Der code kompiliert nicht - einmal:./Str.h:7:19: error: expected class name class Str: public NamespaceTest {
und einmal
testing.cpp:14:25: error: cannot initialize a parameter of type 'NamespaceTest *' with an rvalue of type 'Str *' std::cout << p.compare(&a ,&q) << std::endl;
#include <iostream> #include <vector> #include "NamespaceTest.h" #include <string> #include "Str.h" int main(){ Str a(1.0,4.0); Str b(2.0,2.0); NamespaceTest q(1,2.0); NamespaceTest p(2,3.0); std::cout << p.compare(&a ,&q) << std::endl; return 0; }
#ifndef GUARD_Str_h #define GUARD_Str_h #include <vector> #include "NamespaceTest.h" #include <iostream> class Str: public NamespaceTest { public: Str(double a, double b):a(a), b(b){}; ~Str(){}; double get_member(); double get_member2(); private: double a; double b; }; #endif
#ifndef GUARD_namespacetest_h #define GUARD_namespacetest_h #include <iostream> #include "Str.h" class NamespaceTest { public: NamespaceTest():member{1}, member2{1.0} {}; NamespaceTest(int, double); NamespaceTest(const NamespaceTest& ref){ this->member = ref.member; this->member2 = ref.member2; } int get_member(); void set_member(int x); double get_member2() const; bool compare(NamespaceTest* a, NamespaceTest* b); private: int member; double member2; }; #endif
-
Hallo,
"Str" inkludiert "NamespaceTest" und umgekehrt (zirkular). In NamespaceTest solltest du das entfernen.
-
Du hast einen Cross-Include, d.h. "Str.h" und "NamespaceTest.h" binden sich gegenseitig ein.
Deine
compare
-Funktion besteht quasi aus 3 Objekten (this
,a
undb
). Soll das so sein oder doch nur zwei Objekte vergleichen? Dann entweder nur einen Parameter oder aber diese Funktion alsstatic
deklarieren.Und du solltest deinen Namensgebung verbessern:
NamespaceTest
als Name für eine Klasse?
-
okay mache ich ab jetzt, danke!