struct Return wert einer Funktion aus anderer Klasse



  • Hallo,
    fogendes:

    Wie komme ich an den Returnwert einer Funktion, wenn die Funktion in einer anderen Klasse liegt und der return wert eine Struktur ist.

    z.B. für einen Int ist mir das klar.

    class a { 
    
    int fkt ()...
    }
    
    class b{..}
    

    In der Cpp
    der b Klasse

    a testobj;
    int i;
    
    i= a.fkt();
    if (i ...)
    

    Wenn ich das jetzt mit der structur mache kommt folgender fehler:

    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'a::test' (or there is no acceptable conversion)

    (test ist hier der struct name)

    danke



  • Zeige ein vollständiges, kurzes Beispiel, was Deiner Meinung nach kompilierbar sein soll.



  • Die Fehlermeldung deutet darauf hin das der Bezeichner nicht bekannt ist, bzw. deine Struktur nur im KLassenscope bekannt ist.

    So geht's richtig:

    #include "KeyLogger.h"
    
    struct test
    {
    	int a;
    	int b;
    };
    
    class a
    {
    	public:
    		test fkt()
    		{
    			test Test;
    			Test.a = 10;
    			Test.b = 20;
    
    			return Test;
    		}
    };
    
    int main()
    {
    	a testobj;
    
    	test T = testobj.fkt();
    
    	T;
    }
    


  • a.h

    class a
    {
    
    private:
    
    	struct package{
    		int ID;
    		short data; // Data
    		};
    
    	std::list<package> liste;
    public:
    
    	a();
    	virtual ~a();
    
    	package a::popPackage();
    	//int a::popPackage();	
    };
    

    a.cpp

    a::package_i a::popPackage()
    //int a::popPackage()
    {
    	package temp_package;
    
    	if (!liste.empty())
    	{
    		package temp_package;
    
    		temp_package = *liste.begin();
    		liste.pop_front();
    
    		return temp_package;
    	}
    	else
    	{	int i=-1;
    		temp_package.ID=i;
    		temp_package.data=i;
    		return temp_package;
    
    	}
    }
    

    b.h

    class b
    {
    
    private:
    
    	struct package_r{
    		int ID;
    		short data; // Data
    		};
    
    	std::list<package_r> send_list;
    
    public:
    	b();
    	virtual ~b();
    
             int Router::pushPackage_r();
    
    };
    

    b.cpp

    a obj;
    int b::pushPackage_r()
    {
    	package_r temp_package;
    
    	temp_package = obj_.popPackage();
    	return 0;
    }
    

    wenndi fkt a.popPackage vom typ int ist gehts



  • ansatt int Router::pushPackage_r();
    natürlich
    int b::pushPackage_r(); =



  • a::package und b::package_r haben nichts miteinander zu tun. Auch wenn sie gleich aufgebaut sind, kannst du sie nicht einfach ineinander umwandeln.



  • Da habe ich auch gerade gemerkt. danke.

    Wie kann ich die struct private halten aber die daten über pop an eine andere fkt ausgeben.

    ich will verhindern, dass von außen anders auf die struct bzw. die list zugegriffen wird, außer über die pop fkt.

    Gruß



  • a::package und b::package_r sind zwei verschiedene Typen.

    a obj;
    ...
    b::package_r temp_package;
    temp_package = obj.popPackage();
    

    Du hast keinen Zuweisungsoperator definiert, welcher auf der linken Seite ein b::package_r-Objekt und auf der rechten Seite ein a::package-Objekt akzeptiert. Dabei spielt es keine Rolle, ob die beiden Structs "gleich aufgebaut" sind oder nicht.

    Darüberhinaus hast Du die structs jeweils in der privaten Sektion definiert, womit der Name der Structs für andere nicht zugänglich ist.

    Schreibe Dir einen neuen Header:

    #ifndef PACKAGE_HPP_INCLUDED
    #define PACKAGE_HPP_INCLUDED
    
    struct package
    {
      int ID;
      short data;
    };
    
    #endif
    

    Binde ihn in Deine anderen Header ein, und entferne die Definitionen von a::package und b::package_r.



  • dubbes schrieb:

    a.h

    class a
    {
    private:
    	struct package{
    		int ID;
    		short data; // Data
    		};
    
    	std::list<package> liste;
    public:
    
    	a();
    	virtual ~a();
    
    	package a::popPackage();
    	//int a::popPackage();	
    };
    

    Es sieht nicht so aus, als ob Du einen virtuellen Destruktor brauchen würdest.
    Die Elementfunktion popPackage definiert man auch anders. Das a:: hat dort nichts zu suchen. Das gleiche gilt nochmal für Deine Klasse b.


Anmelden zum Antworten