Avatar billede mxs Nybegynder
02. april 2006 - 15:52 Der er 16 kommentarer

operatoroverloading og brug af send()

Hej. Jeg er ved at lave en slags socket framework eller noget i den stil til privat brug. Jeg har derfor konstrukeret en klasse ved navn virtualWrite som har en operator<<() så man kan bruge den. Det operator<<() skal gøre er at man kan give den en eller flere strenge, og dem kan man så, via <<, skrive til socketen, men hvordan implementere jeg det? Jeg har kun leget med operator==().
Når der gøres brug af operator<<() skal den jo gå ind og bruge send() funktionen, som er defineret sådan her

int send(int sockfd, const void *msg, int len, int flags);

skal min operator<<() så se sådan her ud:

int& operator<<(int& , string);

eller er det helt forkert?
Avatar billede arne_v Ekspert
02. april 2006 - 16:06 #1
næppe

ostream& operator<<(ostream& s,const virtualWrite& z)
{
    send(bla bla bla);
    return s;
}

lyder mere rigtig.
Avatar billede bertelbrander Novice
02. april 2006 - 16:42 #2
Det kommer an på hvordan du vil kunne bruge din << operator.

Hvis den skal kunne bruges på samme måde som med f.ex. cout, så du kan skrive:
socket << "Hello: " << std::hex << SomeInt << endl;
Bliver din klasse nødt til at arve fra en stream class, hvor du så overloader de funktioiner der sender output, når stream'en flush'es eller der kommer et linie skift. Denne metode er ret bøvlet.

Du kan også lave en lettere metode, hvor du laver en << operator for hver type(/gruppe) object der skal kunne stream'es. Dette er noget lettere, men er knap så fleksibelt.

I sidste tilfælde vil jeg mene at du skal lave:
SocketStream& operator operator << (SocketStream& s, const std::string& str);
Avatar billede mxs Nybegynder
02. april 2006 - 16:52 #3
Altså jeg vil jo bare udnytte at man kan skrive

socket<<"hej hej" << "cool";

bertelbrander, SocketStream, er det noget der hedder det, eller er det noget du har fundet på?
Avatar billede mxs Nybegynder
02. april 2006 - 16:56 #4
Det vil sige at jeg faktisk godt kan arve fra stream klassen, og overloade de funktioner jeg nu skal for at få det hele til at glide? Det ville da være det mest fleksible, som du også siger Bertel, for det er jo netop det jeg vil lave, så socket objektet opfører sig som en cout.
Avatar billede mxs Nybegynder
02. april 2006 - 16:56 #5
Men det jeg ikke forstår er at man skal returne en ostream når jeg jo ikke som så vil skrive noget ud på skærmen, men det skal man bare?
Avatar billede arne_v Ekspert
02. april 2006 - 17:04 #6
du skal returnere en stream for at du kan bruge:

s << x << y << z;

fremfor kun:

s << x;
Avatar billede mxs Nybegynder
02. april 2006 - 17:05 #7
Aaaah, så det bliver samlet i en tilsidst og derefter returneret?! Hmm, jeg ved hvad en stream er, men findes der et eller andet sted, noget der fortæller noget grundlæggende om streams. Ikke hvordan man bruger det, men mere hvordan de opføre sig, er defineret osv?
Avatar billede mxs Nybegynder
02. april 2006 - 17:07 #8
Avatar billede mxs Nybegynder
02. april 2006 - 18:59 #9
Kan I hjælpe mig med at tyde det her stykke kode,

bool Socket::send ( const std::string s ) const
{
  int status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );
  if ( status == -1 )
    {
      return false;
    }
  else
    {
      return true;
    }
}

Altså som så forstår jeg det godt, men linjen,

int status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );

er jeg ikke stikker på at jeg helt forstår. Hvad er det lige ::send gør?
Avatar billede arne_v Ekspert
02. april 2006 - 19:05 #10
::send

betyder

send funktionen som ikke er i nogen klasse eller noget namespace
Avatar billede arne_v Ekspert
02. april 2006 - 19:06 #11
hvis de bare brugte send så ville compileren tro at de mente Socket::send

jeg kunne godt sige et par grimme ting om den navngivnings praksis, men ...
Avatar billede mxs Nybegynder
02. april 2006 - 19:16 #12
Aah, ok. Nu når jeg tænker over det mener jeg faktisk at jeg har læst om det engang. Altså jeg har fundet et class lib, som jeg kigger lidt på og henter lidt inspiration fra, men jeg må sige at koden, i mit hoved, er lidt uoverskuelig.
Avatar billede bertelbrander Novice
02. april 2006 - 19:32 #13
Nej der er ikke noget der hedder SocketStream, det var bare noget jeg fandt på.
Avatar billede mxs Nybegynder
02. april 2006 - 19:55 #14
bertel, grunden til at jeg spørger, er at jeg nemlig har fundet nogle uoficelle libs som bliver kaldt det :) Kunne jo være at du ville have mig til at bruge dem, for at gøre det lidt lettere.
Avatar billede bertelbrander Novice
02. april 2006 - 20:10 #15
Det kunne være en god idé at kikke i noget eksisterende kode for at se hvordan man gør.
Men det er sjovere at gøre det selv.

Jeg har ikke selv prøvet at bruge et straming socket bibliotek.
Avatar billede mxs Nybegynder
02. april 2006 - 20:37 #16
Ja det er lidt sjovere at få alle fejlene selv :D Lærer man mere af. Ej men jeg vil bygge et slags framework som er opbygget som noget af Java frameworket med virtuelle og abstrakte klasser. Det jeg ikke lige har så meget styr over er C++'s stream bibliotek, og hvordan den gemmer de forskellige data'er.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester