 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ralph Oliver Schunk Guest
|
Posted: Mon Sep 22, 2003 8:50 am Post subject: Friend funktion der Basisklasse aufrufen. |
|
|
Hallo,
ueber folgendes kleines Problem bruehte ich gerade.
Vielleicht kann einer von euch helfen.
Ich habe meine Klasse von std::map abgleitet.
Dann habe ich zusaetzlich einen kleinen
Zwischenspeicher eingebaut. Wenn ich jetzt
auf einige der Memberfunktionen von std::map
zugreife, dann muss ich diesen Puffer erst
mit der std::map synchronisieren. Sonst
liefert z.B. size() einen zu kleinen
Wert.
Meine Frage ist nun wie kann ich die
friend-operator==<>-Funktion so
implementieren, dass erst synchronisiert
wird und dann die friend-operator==<>-Funktion
von map aufgerufen wird?
Anbei ein Beispiel das mit static_cast arbeitet,
aber ist das der richtige Weg?
Gruss -vorauseilend dankbar- Ralph
#include <iostream>
template<typename T>
class base
{
private:
T const v_;
public:
base(T v) : v_(v) {};
const T&
get_v() {return v_;}
friend
bool operator==<>(const base&, const base&);
};
template<typename T>
bool operator==(const base<T>& a, const base<T>& b)
{
return a.v_ == b.v_;
}
template<typename T>
class my_base : public base<T>
{
private:
void sync() { std::cout << "Syncn";}
public:
my_base( T v) : base
const T& get_v() {sync(); return base<T>::get_v();}
friend
bool operator==<>(my_base&, my_base&);
};
template<typename T>
bool operator==(my_base<T>& a, my_base<T>& b)
{
a.sync();
b.sync();
//---------------
return operator==(
static_cast<base(a), static_cast<base(b));
//---------------
}
int main()
{
base<int> a(5), b(5);
std::cout << b.get_v() << std::endl;
std::cout << a.get_v() << std::endl;
if (a == b)
std::cout << "equaln";
else
std::cout << "unequaln";
my_base
std::cout << c.get_v() << std::endl;
std::cout << d.get_v() << std::endl;
if (c == d)
std::cout << "equaln";
else
std::cout << "unequaln";
return 0;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
André Pönitz Guest
|
Posted: Mon Sep 22, 2003 12:35 pm Post subject: Re: Friend funktion der Basisklasse aufrufen. |
|
|
Ralph Oliver Schunk <ralph.schunk (AT) uni-koeln (DOT) de> wrote:
| Quote: | Hallo,
ueber folgendes kleines Problem bruehte ich gerade.
Vielleicht kann einer von euch helfen.
Ich habe meine Klasse von std::map abgleitet.
|
['public'? Spricht was gegen eine Klasse, die eine solche map und
Deinen Zwischenspeicher als Member hat oder evtl. noch private Ableitung
und passende 'usings'?]
| Quote: | Meine Frage ist nun wie kann ich die
friend-operator==<>-Funktion so
implementieren, dass erst synchronisiert
wird und dann die friend-operator==<>-Funktion
von map aufgerufen wird?
Anbei ein Beispiel das mit static_cast arbeitet,
aber ist das der richtige Weg?
|
Im Prinzip ja. Bei maps als Membern brauchst Du auch den cast nicht...
| Quote: | public:
my_base( T v) : base<T>(v) {};
|
[warum nicht: my_base(T const & v) .... {} // und ohne ';'...]
Andre'
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Ralph Oliver Schunk Guest
|
Posted: Mon Sep 22, 2003 1:01 pm Post subject: Re: Friend funktion der Basisklasse aufrufen. |
|
|
André Pönitz wrote:
| Quote: | ['public'? Spricht was gegen eine Klasse, die eine solche map und
Deinen Zwischenspeicher als Member hat oder evtl. noch private Ableitung
und passende 'usings'?]
Jein. Meine Map verhält sich nach außen genau wie eine std::map. |
Solche Sachen leite ich in der Regel immer ab. Allerdings ist das
Rumspielen mit Implementionsdetails ein Grund nochmal darüber
nachzudenken.
| Quote: | public:
my_base( T v) : base<T>(v) {};
[warum nicht: my_base(T const & v) .... {} // und ohne ';'...]
Oh ja: |
Code-Verschmutzung hervorgerufen durch gedankenlose Fahrlässigkeit.
Danke
Ralph
PS: Ich bevorzuge my_base(const T& v).
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|