C++ Anfänger:Fehler beim Kompilieren

schuetzejanett

Erfahrenes Mitglied
Hallo, ich bin eigentlich ein java Programmierer, doch unser Prof. möchte gerne das wir OpenGl mit C++ Programmieren. Nun sollen wir einen Würfel als Flächenmodell darstellen. dafür habe ich 2 Klassen eine Klasse Face die jeweils eine Fläche kennzeichnet und eine Liste von Punkten bekommt und eine Klasse cube, für den Würfell. Unser Prof hat uns gesagt da wir nur einen Würfel machen, können wir die werte gleich hardcodiert angeben.

Nun habe ich erstmal eine Fläche erstellt, doch beim Kompilieren kommt folgender Fehler.

1>f:\visual studio projekte\opengl\virtuellewelten\template\cube.cpp(19) : error C2440: 'Initialisierung': 'Face *' kann nicht in 'Face' konvertiert werden
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig

Was ist verkehrt?

Hier die beiden Klassen.

Face.h

Code:
#pragma once

using namespace std;

class Face
{
public:
	Face(vector<CPunkt3D>);
	Face();
	virtual ~Face(void);	
	void setVertices(vector<CPunkt3D>);	
	vector<CPunkt3D> getVertices();


private:
	 vector<CPunkt3D> verticesList ;
};

Face.cpp

Code:
#include "StdAfx.h"
#include "Face.h"

Face::Face(vector<CPunkt3D>  vList)
{
	verticesList = vList;	
}

Face::Face()
{
	
}

Face::~Face(void)
{
}

void Face::setVertices(vector<CPunkt3D> vList)
{
	verticesList = vList;
}

vector<CPunkt3D> Face::getVertices()
{
	return verticesList;
}

Cube.h
Code:
#pragma once

class Cube
{
public:
	Cube();
	virtual ~Cube(void);
	
private:
	vector<Face> faceList;

};

cube.cpp

Code:
#include "StdAfx.h"
#include "Cube.h"


Cube::Cube()
{
	vector<CPunkt3D> vPointList;
	vPointList[0].set(0.0,0.0,0.0);
	vPointList[1].set(100.0,0.0,0.0);
	vPointList[2].set(100.0,100.0,0.0);
	vPointList[3].set(0.0,100.0,0.0);
	
	Face f1 = new Face(vPointList);
	
}

Cube::~Cube(void)
{
}
 
Der FEhler liegt in dieser Zeile:
Face f1 = new Face(vPointList);
Es gibt 2 Dinge die du machen könntest:
1. Face f1(vPointList);
oder
2. Face *f1 = new Face(vPointList);

wobei du beim 2. irgendwann auch mal "delete f1;" aufrufen soltlest.

mfg
SGSSGene
 
Okay auch wenn du ein Anfänger bist ... folgende Kritik:
C++:
#pragma once

using namespace std; // 1

class Face
{
public:
	Face(vector<CPunkt3D>); // 2
	Face(); // 3
	virtual ~Face(void);	
	void setVertices(vector<CPunkt3D>);	// 4
	vector<CPunkt3D> getVertices(); // 5


private:
	 vector<CPunkt3D> verticesList ; // 6
};
1) NIEMALS ein using namespace im Header! Damit löst du den Sinn von Namensräumen auf und das kann dir, wenn du es im Header tust und damit auf alle anderen überträgst große Probleme einhandeln!
2) Hier eine Kopie zu übergeben nur um dann wieder eine Kopie zu erzeugen?
3) Nuja warum nicht einfach einen Defaultparameter bei 2 übergeben, dann kannst du dir den Konstruktor hier sparen ;)
4) s. 2
5) Getter sollten const sein, was sie zurückgeben wie in diesem Fall eine einfache const-Ref, so das die Daten selbst nicht direkt angerührt werden können.
6) Du solltest dir ein Kürzel ausdenken, mit dem du Membervariablen von Lokalen/Globalen unterscheidest.

=>
C++:
#if !defined FACE_HPP__INCLUDED
#define FACE_HPP__INCLUDED

#pragma once

namespace geometry 
{
    class Face
    {
        std::vector<Point> m_vertices;
    
    public:
        Face(std::vector<Point> const& rhs = std::vector<Point>())
            : m_vertices(rhs)
        {}
        virtual ~Face() 
        {}

    public:
        void set_vertices(std::vector<Point> const& rhs) 
        { m_vertices = rhs; }
        std::vector<Point> const& get_vertices() const 
        { return m_vertices; }
    };
}; // geometry

#endif // FACE_HPP__INCLUDED
....
 
Zurück