Avatar billede oddi Nybegynder
06. november 2006 - 16:04 Der er 11 kommentarer

operator overloading igen igen

Hej

Jeg har en funktion som følgende:

const OV_socket& OV_tcp::operator>> (std::string& s)
{
    if(OV_readline(socket_id, s, MAXLINE) < 0)
    {
        cout << "Fejl i OV_readline!\n";
        exit(0);
    }
    return(*this);
}

Test af operator overloader:

string data;

OV_socket *s = new OV_tcp();

*s >> data;

Min OV_readline er testet og virker. Programmet kompilerer, men når det køres, venter programmet på et indput, altså *s >> venter på bruger indput, når det egentlig skulle vente på et input fra socket.

Hvad gør jeg forkert?
Mvh. Oddi.
Avatar billede oddi Nybegynder
06. november 2006 - 17:56 #1
Hej

Jeg har ivørigt i min test funktion skrevet: using namespace std; Kan dette betyde at programmet vælger at bruge std operator>> ?
Avatar billede bertelbrander Novice
06. november 2006 - 19:37 #2
#include <string>
#include <iostream>
class OV_socket
{
public:
  virtual OV_socket& operator >> (std::string&s) = 0;
};
class OV_tcp : public OV_socket
{
  virtual OV_socket& operator >> (std::string&s);
};

OV_socket& OV_tcp::operator>> (std::string& s)
{
  s = "pop";
  return(*this);
}

int main()
{
  std::string data;
  OV_socket *s = new OV_tcp();
  *s >> data;
  std::cout << data << std::endl;
}
Avatar billede oddi Nybegynder
06. november 2006 - 19:52 #3
Hej Bertelbrander

Hvis funktionen indeholder:

OV_socket& OV_tcp::operator>> (std::string& s)
{
  s = "pop";
  return(*this);
}

udskriver: std::cout << data << std::endl; -> pop
Avatar billede bertelbrander Novice
06. november 2006 - 20:02 #4
Ja, var det ikke meningen?
Avatar billede oddi Nybegynder
06. november 2006 - 20:32 #5
Nej det er menningen at min OV_socket& OV_tcp::operator>> (std::string& s) funktion skal læse fra socket, med min OV_readline som benytter read().

Tanken var at jeg kunne læse fra min tcp socket med operator>>, i stedet for at lave et komplekst funktions kald til min OV_readline() funktion. min operator>> skal sørge for at OV_readline() bliver kaldt og sætter det modtagede data ind i data variablen.
Avatar billede bertelbrander Novice
06. november 2006 - 20:36 #6
Det var bare et eksempel, da jeg ikke har nogen OV_readline

Så du skal erstatte
  s = "pop";
Med dit kald til OV_readline
Avatar billede oddi Nybegynder
06. november 2006 - 20:39 #7
Det gør jeg også:

const OV_socket& OV_tcp::operator>> (std::string& s)
{
    if(OV_readline(socket_id, s, MAXLINE) < 0)
    {
        cout << "Fejl i OV_readline!\n";
        exit(0);
    }
    return(*this);
}

men problemet er at programmet venter på et bruger indput fra terminalen i stedet for at læse fra min tcp socket, når jeg gør følgende:

*s >> data;
Avatar billede bertelbrander Novice
06. november 2006 - 20:51 #8
Det forstår jeg ikke

Hvordan ser resten af koden ud?
OV_tcp arver fra OV_socket?
OV_socket arver fra?
Avatar billede bertelbrander Novice
06. november 2006 - 21:00 #9
Og hvad gør OV_readline?
Er det en global funktion eller en member af?
Avatar billede oddi Nybegynder
06. november 2006 - 21:10 #10
OV_socket er abstract klasse.

Når jeg læser fra min tcp socket kan jeg bruge OV_readline() funktionen som er deklareret i OV_socket.

f.eks:

std::string data;

OV_socket *s = new OV_tcp();

//lave socket osv.....

s->OV_readline(socket_id, data, MAXLINE); //læser fra tcp socket. (dette virker)
std::cout << data;

i stedet vil jeg bruge operator>> til at læse fra min tcp socket.

f.eks:

std::string data;
OV_socket *s = new OV_tcp();

//lave tcp socket osv...

*s >> data; //læse fra tcp socket. Dette virker ikke, programmet venter på et bruger input fra     
            //terminalen.
std::cout << data; //udskrive de modtagede data fra socket.

Jeg har iøvrigt fået operator<< til at virke som jeg vil.

operator<< :

OV_socket& OV_tcp::operator<< ( std::string& s )
{   
    if(OV_write_n(socket_id, s, s.size()) < 0)
        exit(0);
    return(*this);
}

ex:
std::string data = "server echo\n";
OV_socket *s = new OV_tcp();
s << data; // sender data til tcp socket.

Jeg håber at dette er mere forståeligt :/
Avatar billede bertelbrander Novice
06. november 2006 - 21:26 #11
Jeg ved ikke om jeg blev klogere af det.
Hvad adskiller din kode fra min?

Du kan evt. sende mig hele koden, min email adresse står under min profil.
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