Utskriftsoperator i c++ [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Utskriftsoperator i c++ [LÖST]

Inlägg av micke_nordin »

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:

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
Den sista utskriften borde vara 2 inte 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;
}
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
Senast redigerad av 2 micke_nordin, redigerad totalt 23 gång.
gusnan
Inlägg: 348
Blev medlem: 17 jan 2007, 08:20
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Utskriftsoperator i c++

Inlägg av gusnan »

Du måste casta *d i utskriften till dummy.

raden

Kod: Markera allt

os << "Denna dummywrapper har en dummy med värdet: " << *d << endl; //Skriv ut dummyn
skall va

Kod: Markera allt

os << "Denna dummywrapper har en dummy med värdet: " << (dummy)(*d) << endl; //Skriv ut dummyn
(Man kan ju tycka att den skulle tolka det som dummy ändå - men jag misstänker att iom att du använder dig av *-operatorn så omvandlas det till en adress (alltså ett heltal).
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Utskriftsoperator i c++

Inlägg av micke_nordin »

cowboy skrev:Du måste casta *d i utskriften till dummy.
Va bra! Nu funkar det.

I skoluppgiften som jag har har jag fyra subklasser, Point, Circle, Polygon och Rectangle som ärver superklassen Shape, pekare till dessa subklasser ligger lindade i en klass kallad shapeptr. Jag gissar att jag då får använda typeid för att kolla vilken typ det är innan jag castar, eller finns det nått bättre sätt?

/Micke
gusnan
Inlägg: 348
Blev medlem: 17 jan 2007, 08:20
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Utskriftsoperator i c++

Inlägg av gusnan »

Det borde gå att casta till superklassen Shape - om det är en virtuell metod som anropas skall ju metoden i dom ärvda klasserna anropas. Jag är lite osäker på om det blir så dock, men jag gissar att det borde bli så...
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Utskriftsoperator i c++

Inlägg av micke_nordin »

cowboy skrev:Det borde gå att casta till superklassen Shape - om det är en virtuell metod som anropas skall ju metoden i dom ärvda klasserna anropas. Jag är lite osäker på om det blir så dock, men jag gissar att det borde bli så...
Jag får prova mig fram lite, jag gissar att problemet kommer av att det är en friend implementerad i de olika subklasserna och inte en vanlig virtuell metod. För de funkar som de skall redan. Jag vet inte ens om det går att deklarera en virtuell friend-operator (men jag får väl testa :).

Tack för hjälpen!

/Micke
Skriv svar

Återgå till "Programmering och webbdesign"