Problem med konstruktor 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:

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

Inlägg 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
Senast redigerad av 1 micke_nordin, redigerad totalt 1 gånger.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Problem med konstruktor i C++

Inlägg av Lars »

Googla efter hur en copy constructor deklareras, det är en liten detalj du har missat ;)
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Problem med konstruktor i C++

Inlägg 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 ;)
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Problem med konstruktor i C++

Inlägg 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
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

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

Inlägg 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.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

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

Inlägg 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.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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
Skriv svar

Återgå till "Programmering och webbdesign"