Operator + überladen bei Struktur



  • Es funktioniert nicht. Weder bei Inkludieren in die struct-Konstruktion noch außerhalb

    Ich bekomme ständig Fehler, wie:

    1>c:\applications\test01\test01\test01dlg.cpp(518) : error C2803: 'operator +' must have at least one formal parameter of class type
    1>c:\applications\test01\test01\test01dlg.cpp(518) : error C2027: use of undefined type 'm_TimeStruct'
    1> c:\applications\test01\test01\test01dlg.cpp(517) : see declaration of 'm_TimeStruct'

    Gibt es keine "optimale" Lösung?



  • Wenn du den Operator ausserhalb der Klasse definierst, musst Du die Struktur natürlich als innere Struktur dieser Klasse kennzeichnen.

    AussereKlasse::m_TimeStruct operator+(AussereKlasse::m_TimeStruct const& rhs, double a);
    

    ...Grundlagen 😉



  • Ok, hab ich versucht. Nochmal der Code dazu vielleicht.

    header:

    class Ctest01Dlg : public CDialog
    {
    private:
    	...
    	struct m_TimeStruct
    	{
    		int nDay, nMon, nYear, nHour, nMin;
    		double fSec;
    	};
    	m_TimeStruct m_TimeGPS, m_TimeInitHiRes, m_TimeInitGPS;
    	...
    public:
    	...
    	Ctest01Dlg::m_TimeStruct operator + (Ctest01Dlg::struct m_TimeStruct p, double a);
    };
    

    cpp

    m_TimeStruct Ctest01Dlg::operator + (m_TimeStruct p, double a)
    {
    	m_TimeStruct help;	
    	return help;
    }
    

    ergibt:

    1>c:\applications\test01\test01\test01dlg.h(73) : error C2589: 'struct' : illegal token on right side of '::'
    1>c:\applications\test01\test01\test01dlg.h(73) : error C2059: syntax error : '::'
    1>test01Dlg.cpp
    1>c:\applications\test01\test01\test01dlg.h(73) : error C2589: 'struct' : illegal token on right side of '::'
    1>c:\applications\test01\test01\test01dlg.h(73) : error C2059: syntax error : '::'
    1>c:\applications\test01\test01\test01dlg.cpp(517) : error C2143: syntax error : missing ';' before 'Ctest01Dlg::operator +'
    1>c:\applications\test01\test01\test01dlg.cpp(517) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\applications\test01\test01\test01dlg.cpp(518) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\applications\test01\test01\test01dlg.cpp(518) : error C2511: 'int Ctest01Dlg::operator +(Ctest01Dlg::m_TimeStruct,double)' : overloaded member function not found in 'Ctest01Dlg'
    1> c:\applications\test01\test01\test01dlg.h(19) : see declaration of 'Ctest01Dlg'

    Irgendwo häng ich...



  • wo häng ich nur 🙂
    Bitte nochmal um Hilfe.



  • Du sollst den Operator als freie Funktion definieren. Nicht als Member von Ctest01Dlg oder von Ctest01Dlg::m_TimeStruct.



  • Was heißt "freie" Funktion?

    Außerhalb der Klasse?:

    class bla
    {
    };
    
    struct m_TimeStruct operator + (struct m_TimeStruct p, double a);
    

    Und wie soll ich dann die Überladung in der cpp realisieren? Weil dann meckert er mir dort wieder rum, dass er net auf die privates der Klasse zugreifen kann etc.



  • ich komm nicht dahinter.. Wie muss das richtig aussehen?



  • Probier es mal so:

    struct MyTimeStruct
    {
        int nDay, nMon, nYear, nHour, nMin;
        double fSec;
    };
    
    MyTimeStruct operator + (MyTimeStruct p, double a)
    {
        ...
    }
    
    class Ctest01Dlg : public CDialog
    {
    private:
        ...
        MyTimeStruct m_TimeGPS, m_TimeInitHiRes, m_TimeInitGPS;
        ...
    public:
        ...
    };
    


  • // test01Dlg.h : header file
    //
    #include "string...
    
    #pragma once
    
    struct m_TimeStruct
    {
        int nDay, nMon, nYear, nHour, nMin;
        double fSec;
    };
    
    m_TimeStruct operator + (m_TimeStruct p, double a)
    {
        return p;
    } 
    
    // Ctest01Dlg dialog
    class Ctest01Dlg : public CDialog
    {
    // Construction
    public:
    	Ctest01Dlg(CWnd* pParent = NULL);	// standard constructor	
    	CListBox m_ctlLB1;
    
    // Dialog Data
    	enum { IDD = IDD_TEST01_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    
    // Implementation
    protected:
    	...
    
    private:
    	...
    	/*struct m_TimeStruct
    	{
    		int nDay, nMon, nYear, nHour, nMin;
    		double fSec;
    	};*/
    	m_TimeStruct m_TimeGPS, m_TimeInitHiRes, m_TimeInitGPS;
    	...
    
    public:
    	...
    
    };
    

    Jetzt bekomm ich 2 herbe Linker-Fehler, die ich nicht deuten kann.

    1>test01Dlg.obj : error LNK2005: "struct m_TimeStruct __cdecl operator+(struct m_TimeStruct,double)" (??H@YA?AUm_TimeStruct@@U0@N@Z) already defined in test01.obj

    1>C:\Applications\test01\Debug\test01.exe : fatal error LNK1169: one or more multiply defined symbols found

    edit: in der cpp ist die überladung natürlich auch auskommentiert.



  • ja, gut, was sucht die definition der überladung auch im header.

    habs hinbekommen. trotzdem blöd, dass ich die struktur definition nicht in der klasse lassen kann.

    dennoch danke!



  • Jöran schrieb:

    trotzdem blöd, dass ich die struktur definition nicht in der klasse lassen kann.

    Kann sie doch. Jencas hat dich da wohl auf die falsche Fährte gelockt. dazu muss der op noch als friend von outer deklariert werden.
    Folgendes müsste gehn (kanns aber grad nicht sicher sagen):

    class outer
    {
      class inner
      {
        int i;
      };
      friend inner operator+(inner const& lhs, double rhs);
    
      /*...*/
    };
    
    outer::inner operator+ (outer::inner const& lhs, double rhs)
    {
      /* ... */
    }
    

    Ohne Gewähr...


Anmelden zum Antworten