Sida 1 av 1

Problem med konstruktor i C++ [LÖST]

Postat: 01 mar 2009, 14:12
av micke_nordin
Disclamer: Detta är till en skoluppgift, jag vill alltså snarare ha hjälp att hitta lösningen än själva lösningen.

Jag har en egen klass "Vertex", Vertex.h ser ut så här:

Kod: Markera allt

#ifndef _Vertex_h_included_
#define _Vertex_h_included_
#include <iostream>
#include <fstream>
using namespace std;

class Vertex
{
	private:
		static int totSumVertices;
		double xPos;
		double yPos;
	
	public:
		Vertex();
		Vertex(Vertex &v);
		Vertex(double x, double y);
		~Vertex();
		double getXPos(){return xPos;};
		double getYPos(){return yPos;};
		void setXPos(double x){xPos = x;};
		void setYPos(double y){yPos = y;};
		Vertex operator=(Vertex &v); 
		friend ostream & operator<<(ostream &os, Vertex &v);
};
#endif
Jag har ett huvudprogram som ser ut så här:

Kod: Markera allt

#include "Vertex.h"

int Vertex::totSumVertices = 0;

int main(int argc, char** argv)
{
	Vertex v1(1.1, 2.2);
	cout << v1;
	Vertex v2(v1);
	cout << v2;
	Vertex v3;
	v3 = v2;
	cout << v3;
	Vertex v4(Vertex(0,0));
	
	return 0;
}
Allting funkar bra utom det sista Vertex v4(Vertex(0,0)); (som enligt lärare skall kunna användas), jag får följande fel:

Kod: Markera allt

g++ -g *.cpp -Wall (i sökväg: /home/micke/c++/skoluppgifter/Kurs2/ou1)
test.cpp: In function "int main(int, char**)":
test.cpp:35: fel: ingen matchande funktion för anrop av "Vertex::Vertex(Vertex)"
Vertex.h:38: anm: kandidater är: Vertex::Vertex(double, double)
Vertex.h:37: anm:                Vertex::Vertex(Vertex&)
Vertex.h:36: anm:                Vertex::Vertex()
Kompileringen misslyckades.
Vad har jag gjort för fel, vad krävs för att den konstruktionen ska funka? Det är ju inte tillåtet att skapa en konstruktor enl. Vertex(Vertex v);

Utanför ämnet: ps. jag är obenägen att posta själva implementeringen eftersom det är en skoluppgift, ev kursare här på forumet måste finna sin egen lösning

/Micke

Re: Problem med konstruktor i C++

Postat: 01 mar 2009, 19:56
av Lars
Googla efter hur en copy constructor deklareras, det är en liten detalj du har missat ;)

Re: Problem med konstruktor i C++

Postat: 01 mar 2009, 20:13
av mcNisse
Det har egentligen med att du anropar Vertex(Vertex &w) med ett värde som inte lagras i en variabel. Detta gör värdet till något annat än vad det ser ut att vara ;)

Re: Problem med konstruktor i C++

Postat: 01 mar 2009, 21:46
av micke_nordin
Många tack! Felet hittat. Jag började med att deklarera parametern som const:

Vertex(const Vertex &v);

Men fick då följande fel:

Kod: Markera allt

g++ -g *.cpp -Wall (i sökväg: /home/micke/c++/skoluppgifter/Kurs2/ou1)
Vertex.cpp: In copy constructor "Vertex::Vertex(const Vertex&)":
Vertex.cpp:33: fel: att skicka "const Vertex" som "this"-argument till "double Vertex::getXPos()" kastar kvalificerare
Vertex.cpp:34: fel: att skicka "const Vertex" som "this"-argument till "double Vertex::getYPos()" kastar kvalificerare
Kompileringen misslyckades.
Jag antog då att min ursprungliga deklaration var fel, men det jag gjort fel var i själva verket detta:

Kod: Markera allt

Vertex::Vertex(const Vertex &v)
{
	xPos = v.getXPos();
	yPos = v.getYPos();
	totSumVertices++;
}
Egentligen ska det vara:

Kod: Markera allt

Vertex::Vertex(const Vertex &v)
{
	xPos = v.xPos;
	yPos = v.yPos;
	totSumVertices++;
}
Tack igen för att ni hjälpte mig hitta felet!

/Micke

Re: Problem med konstruktor i C++ [LÖST]

Postat: 02 mar 2009, 11:06
av Lars
Alternativt tror jag att du kan deklarera getXPos() som const också. Jag har för mig att det skrivs "double getXPos() const" i klassdeklarationen, det betyder då att funktionen inte påverkar värdet av objektet.

Re: Problem med konstruktor i C++ [LÖST]

Postat: 07 mar 2009, 15:38
av skaggapa
Tips från en kursare.

Alla medoder som inte ändrar några värden, tex getters, ska i denna kurs deklareras som const.

Re: Problem med konstruktor i C++ [LÖST]

Postat: 07 mar 2009, 22:39
av micke_nordin
skaggapa skrev:Tips från en kursare.

Alla medoder som inte ändrar några värden, tex getters, ska i denna kurs deklareras som const.
Jo, jag har fixat det. När jag blev varse vad som var fel har jag läst på och ordnat. Man får visst inte använda några metoder hos objekt som är deklarerade som const om inte metoderna själva är const deklarerade.

Kul med en kursare föresten!

/Micke