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 und b). Soll das so sein oder doch nur zwei Objekte vergleichen? Dann entweder nur einen Parameter oder aber diese Funktion als static deklarieren.

    Und du solltest deinen Namensgebung verbessern: NamespaceTest als Name für eine Klasse?



  • okay mache ich ab jetzt, danke!


Anmelden zum Antworten