--University homework--Referenzen von Objekten in generischen Funktionen (mit Zeiger oder Nicht-Zeiger-Attribute) Rückkehr
ich bereits mit generischen Funktionen gearbeitet haben, die wie folgt aussehen:
template<class T1, class T2, int max>
class Collection{
T1* _elements1[max];
T2* _elements2[max];
int _count;
public:
// ctor
bool AddElement(const T1& e1, const T2& e2)
{
for (int i = 0; i < _count; i++)
if (_elements1[i] == e1 && _elements2[i] == e2)
return false;
_elements1[_count] = e1;
_elements2[_count] = e2;
_count++;
return true;
}
int GetMax()const { return max;}
T1& GetElement1(int index)const { return *_elements1[index]; }
T2& GetElement2(int index)const { return *_elements2[index]; }
}
In main()
:
Collection<int, double, 6> collection;
for (int i = 0; i < 6; i++)
collection.AddElement(i, i + 0.4);
cout << collection << endl;
I const
auch für diese Klasse in operator<<
verwenden und alles funktioniert gut, keine Beschwerden Compilerim Zusammenhang.
Aber heute habe ich eine etwas andere Version dieser Klasse ausprobiert, die wir üben sollten, weil sie in irgendeiner Form auf der Prüfung sein wird.
template<class T1, class T2, int max>
class Collection{
T1 _elements1[max];
T2 _elements2[max];
int _count;
public:
// ctor
int GetMax()const { return max;}
T1& GetElement1(int index)const { return _elements1[index]; }
T2& GetElement2(int index)const { return _elements2[index]; }
}
Der hier Unterschied ist, dass T1
und T2
ist nicht Arrays von pointers
aber Arrays von einfachen Objekten, und auch im Boden, wenn return
ing, besteht keine Notwendigkeit zu dereferenzieren ist.
jedoch im letzteren Beispiel, erhalte ich diese Fehlermeldung:
error C2440: 'return' : cannot convert from 'const int' to 'int &'
Obwohl ich es getan habe Google und fand heraus, wenn ich eine andere const
vor diesen Funktionen so:
const T1& GetElement1(int index)const { return _elements1[index]; }
const T2& GetElement2(int index)const { return _elements2[index]; }
der Fehler ist weg.
Zugegeben, das hat mein Problem gelöst, aber ich würde lieber lernen, warum passiert das und was genau passiert unter der Haube. Wenn es eine einfache Möglichkeit gibt, den Unterschied zwischen den beiden Beispielen, die ich zur Verfügung gestellt habe, zu erklären, wäre dies sehr zu begrüßen.
Was sind 'T1' und' T2' in dem Beispiel, das nicht kompiliert werden kann? – NathanOliver
An dieser Stelle teste ich mit 'int' und' double' jeweils mit einer einfachen for-Schleife die Sammelfunktion AddElement (const T1 & e1, const T2 & e2). Bitte beachten Sie, dass der gleiche Test in dem anderen Beispiel angewendet wird (wobei T1 und T2 ein Array von Zeigern sind) und es nicht fehlschlägt. – developer10
Also rufen Sie sowohl 'GetElement1' und' GetElement2' auf, sondern erhalten nur einen Fehler mit 'GetElement1'? – NathanOliver