C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Friend funktion der Basisklasse aufrufen.

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Ralph Oliver Schunk
Guest





PostPosted: Mon Sep 22, 2003 8:50 am    Post subject: Friend funktion der Basisklasse aufrufen. Reply with quote



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





PostPosted: Mon Sep 22, 2003 12:35 pm    Post subject: Re: Friend funktion der Basisklasse aufrufen. Reply with quote



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





PostPosted: Mon Sep 22, 2003 1:01 pm    Post subject: Re: Friend funktion der Basisklasse aufrufen. Reply with quote



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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.