Utskriftsoperator i c++ [LÖST]
Postat: 23 jul 2009, 14:39
Jag får konstig utskrift i när jag försöker skriva ut med hjälp av en överlagrad utskriftsoperator. Jag har två klasser: dummy och dummywrapper. dummy har en medlemsvariabel av typen int medan dummywrapper har en pekare till en dummy. dummy har en överlagrad utskriftsoperator som skickar tillbaka ett ostreamobjekt med variabeln, medan dummywrapper har en utskriftsoperator som i sin tur anropar utskriftsoperatorn i dummy. Jag har ett testprogram som ger följande utskrift:
Den sista utskriften borde vara 2 inte 134515040.
Så här ser koden ut:
Programmet använder också en fil kallad "test.txt" (som finns i samma katalog som programmet) som bara innehåller ett heltal, i mitt fall en 2:a. Detta är det enklaste testprogram som jag kunde hitta på för att testa ett fel jag får i en skoluppgift. Detta är alltså inte själva skoluppgiften. Någon som kan tipsa mig om vad som är fel?
/Micke
Kod: Markera allt
micke@hal:~/c++/skoluppgifter/Kurs2/ou5/dummy$ g++ dummy.cpp
micke@hal:~/c++/skoluppgifter/Kurs2/ou5/dummy$ ./a.out
Denna dummy har värdet: 0
Denna dummy har värdet: 2
Värde i getDummy(): 2
Denna dummywrapper har en dummy med värdet: 134515040
Så här ser koden ut:
Kod: Markera allt
/*
* dummy.cpp
*
* Copyright 2009 Micke Nordin <micke@hal>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
//Dummy-deklaration
class dummy
{
private:
int i; //Ett tal
public:
dummy(); //Defaultkonstruktor
dummy(int i); //Överlagrad konstruktor
int getI() const; //Hämta talet
void setI(int ii); //Ställ om talet
friend ostream & operator<<(ostream &os, const dummy &d); //Överlagrad utskriftsoperator
friend dummy & operator>>(istream &is, dummy &d); //Överlagrad inläsningsoperator
};
//Dummywrapper-deklaration
class dummywrapper
{
private:
dummy *md; //En pekare till en dummy
public:
dummywrapper(); //Defaultkonstruktor
dummywrapper(dummy *dd); //Överlagrad konstruktor
dummywrapper(const dummywrapper &dw); //Kopieringskonstruktor
dummy* getDummy() const; //Hämta pekaren
friend ostream & operator<<(ostream &os, const dummywrapper &dw); //Överlagrad utskriftsoperator
};
//Dummy implementering
dummy::dummy()
{
i = 0;
}
dummy::dummy(int ii)
{
i = ii;
}
int dummy::getI() const
{
return i;
}
void dummy::setI(int ii)
{
i = ii;
}
ostream & operator<<(ostream &os, const dummy &d)
{
os << d.getI();
return os;
}
dummy & operator>>(istream &is, dummy &d)
{
string s;
getline(is,s);
d.i = atoi(s.c_str());
return d;
}
//Dummywrapper implementering
dummywrapper::dummywrapper()
{
md = 0; //Default är nullpekare
}
dummywrapper::dummywrapper(dummy *dd)
{
md = dd; //peka på dd
}
dummywrapper::dummywrapper(const dummywrapper &dw)
{
md = dw.getDummy(); //Gör djupkopiering med getDummy()
}
dummy* dummywrapper::getDummy() const
{
dummy d(md->getI()); //En ny dummy med värdet från den gamla
dummy *dptr; //En ny pekare till en dummy
dptr = &d; //Peka pekaren mot dummyn
cout << "Värde i getDummy(): " << *dptr << endl; //Kontrollutskrift som blir rätt
return dptr; //Skicka tillbaka den nya pekaren
}
ostream & operator<<(ostream &os, const dummywrapper &dw)
{
dummy *d = dw.getDummy(); //Skapa en ny pekare till en dummy
os << "Denna dummywrapper har en dummy med värdet: " << *d << endl; //Skriv ut dummyn
return os;
}
//Main
int main()
{
dummy md; //Skapa en dummy
cout << "Denna dummy har värdet: " << md << endl; //Här blir det rätt
ifstream f("test.txt"); //Fil att hämta värdet från
f >> md; //Hämtar värdet
cout << "Denna dummy har värdet: " << md << endl; //Här blir det också rätt med det uppdaterade värdet
dummywrapper mdw(&md); //Skapa en dummywrapper
cout << mdw; //Här skriver den ut fel värde
return 0;
}
/Micke