Operator + überladen bei Struktur
-
Servus,
ich bekomms gerade nicht hin meine so definierte Struktur:
struct m_TimeStruct
{
int nDay, nMon, nYear, nHour, nMin;
double fSec;
};zu überladen.
Folgendes habe ich bereits ausprobiert:
struct m_TimeStruct operator + (struct m_TimeStruct, double a)
{
/**/
}struct m_TimeStruct operator + (double a)
{
/**/
}Sinn soll es sein Sekunden auf ein Datum zu addieren...
Bei der 1. Variante kommen mir folgende Fehler ins Haus:
1>c:\applications\test01\test01\test01dlg.h(73) : error C2804: binary 'operator +' has too many parameters
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'
1>c:\applications\test01\test01\test01dlg.cpp(518) : error C2079: 'operator +' uses undefined struct 'm_TimeStruct'
1>c:\applications\test01\test01\test01dlg.cpp(519) : error C2673: 'operator +' : global functions do not have 'this' pointers
1>c:\applications\test01\test01\test01dlg.cpp(519) : error C2079: 'tmp' uses undefined struct 'm_TimeStruct'
1>c:\applications\test01\test01\test01dlg.cpp(519) : fatal error C1903: unable to recover from previous error(s); stopping compilationBei der 2. siehts ähnlich aus.
Aber ich glaube mein Prob liegt da einfach in der Überladung selbst, oder?
Was mich auch wundert ist, dass er den Typ irgendwie nicht kennen will, obwohl der im zugehörigen Header steht.Freu mich übern Vorschlag.
Grüße, Jöran
-
Also
struct m_TimeStruct { int nDay, nMon, nYear, nHour, nMin; double fSec; }; m_TimeStruct operator + (struct TimeStruct, double a) { // ... }sollte eigentlich gehen. Du musst natürlich eine Struktur zurückgeben, das ist klar. Ansonsten könnte man zur Verschönerung konstante Referenzen in der Paramaterliste benutzen.
-
m_TimeStruct operator + (struct m_TimeStruct, double a);1>c:\applications\test01\test01\test01dlg.h(73) : error C2804: binary 'operator +' has too many parameters
Zudem hab ich dann doch gar keine Variable für meine Struktur, während die double "a" heißt, oder?
-
Also bei mir funktionierts. Haste vielleicht nochmal was verändert? Naja, zeig mal dienen kompletten Code.
-
test01dlg.h
struct m_TimeStruct { int nDay, nMon, nYear, nHour, nMin; double fSec; }; m_TimeStruct m_TimeGPS, m_TimeInitHiRes, m_TimeInitGPS; .... public: afx_msg void OnBnClickedOk(); void tReadComPort(); static UINT tThread1(LPVOID pParam); .... m_TimeStruct operator + (struct m_TimeStruct, double a);test01dlg.cpp
m_TimeStruct operator + (struct m_TimeStruct, double a) { m_TimeStruct help; return help; }bin mit vs2005 und mfc unterwegs
-
Seit wann darf public auf Namespaceebene stehen?
Aha, also doch kein kompletter Code :p
operator+ muss entweder eine freie Funktion mit zwei Parametern oder aber eine Memberfunktion mit einem Parameter sein. Bei Dir scheint m_TimeStruct eine innere Klasse zu sein, der operator+ würde daher zur äusseren Klasse gehören und nicht zu m_TimeStruct.
Das Schlüsselwort struct vor einem Typen brauchst Du in C++ nicht mehr. Wenn Du den ersten Parameter von operator+ benutzen möchtest, musst Du ihm einen Namen geben.
(Am Rande: Das Kürzel m_ für Typen ist mir noch nie untergekommen)
-
Ok, und wie bring ich ihm bei, dass er zur Struktur gehören soll und nciht zur äußeren Klasse?
Wenns hilft, hier nochmal der fast komplette Headercode:
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: afx_msg void OnBnClickedOk(); void tReadComPort(); static UINT tThread1(LPVOID pParam); //vector<string*>* explode(string str, char delimiter); afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButton2(); afx_msg void OnBnClickedCancel(); afx_msg void OnBnClickedButton3(); m_TimeStruct operator + (struct m_TimeStruct, double a); };
-
Das bringst Du ihm bei,indem Du den operator+ zum Member der inneren Struktur machst.
struct m_TimeStruct { ... m_TimeStruct operator+(double a); };
-
Der operator sollte weder zur struct noch zur äußerten Klasse gehören sondern eine freie Funktion sein.
-
Und was bedeutet freie Funktion in dem Fall?
Ist das Hinzufügen zur struct nicht sauber oder warum sollte er nicht dazu gehören?Danke
-
Jöran schrieb:
Und was bedeutet freie Funktion in dem Fall?
Ich schätze mal er meint das:
struct m_TimeStruct { int nDay, nMon, nYear, nHour, nMin; double fSec; }; m_TimeStruct operator + (struct TimeStruct, double a) { // ... }
-
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.