Class: Problem mit Methoden Deklaration



  • Hallo,

    bin grad wie wild am C++ Programmieren doch hier stoße ich grad auf ein Problem.
    Ich hab ein Aufgabenblatt bei dem man 2 Klassen schreiben soll. Allerdings werden die Klassen bei jeder Aufgabe ein bischen erweitert. Jetzt wollte ich im Visual Studio das komplette Aufgabenblatt in ein Projekt machen. Also pro Aufgabe eine cpp und eine hpp-File.
    Und natürlich eine hpp für jede Klasse.

    JEtzt hab ich nur das Problem das ich einen Fehler bekomme sobald ich die Methoden der Klassen im selben Header File deklariere. Wenn ich diese Methoden allerdings erst in der CPP der jeweiligen Aufgaben CPP erstelle funktioniert es. Allerdings gibt es dann Probleme da ich ja in jeder Aufgaben CPP dieselben Methoden definiert habe.
    Es muss doch möglich sein die Methoden innerhalb der Klassen hpp zu erstellen so dass ich in jeder Aufgaben CPP zugriff darauf habe?

    bisher sieht es so aus:

    #include <iostream>
    using namespace std;
    
    class Circle
    {
    private:
    	Point centre;
    	double radius;
    
    public:
    	Circle()
    	{
    		centre.init(0, 0);
    		radius = 0;
    	}
    	Circle(Point px, double rad)
    	{
    		centre = px;
    		radius = rad;
    	}
    	void init(Point zent, double rad);
    	void move(double dx, double dy);
    	void print(bool end=true);
    };
    
    void Circle::init(Point zent, double rad)
    {
    	centre = zent;
    	radius = rad;
    }	
    
    void Circle::move(double dx, double dy)
    {
    	centre.move(dx, dy);
    }
    
    void Circle::print(bool end)
    {
    	if(end==true)
    		cout << endl;
    	cout << "Konstruktor der Klasse Circle, Objekt: ";
    	cout << "<";
    	centre.print();
    	cout << ", " << radius << ">";
    }
    

    Als Ausgabe beim compilieren erhalte ich das hier:

    aufg3_2.obj : error LNK2005: "public: void __thiscall Circle::init(class Point,double)" (?init@Circle@@QAEXVPoint@@N@Z) already defined in aufg3_1.obj
    aufg3_2.obj : error LNK2005: "public: void __thiscall Circle::move(double,double)" (?move@Circle@@QAEXNN@Z) already defined in aufg3_1.obj
    aufg3_2.obj : error LNK2005: "public: void __thiscall Circle::print(bool)" (?print@Circle@@QAEX_N@Z) already defined in aufg3_1.obj
    aufg3_3.obj : error LNK2005: "public: void __thiscall Circle::init(class Point,double)" (?init@Circle@@QAEXVPoint@@N@Z) already defined in aufg3_1.obj
    aufg3_3.obj : error LNK2005: "public: void __thiscall Circle::move(double,double)" (?move@Circle@@QAEXNN@Z) already defined in aufg3_1.obj
    aufg3_3.obj : error LNK2005: "public: void __thiscall Circle::print(bool)" (?print@Circle@@QAEX_N@Z) already defined in aufg3_1.obj
    aufg3_1.obj : error LNK2019: unresolved external symbol "public: void __thiscall Point::move(double,double)" (?move@Point@@QAEXNN@Z) referenced in function "public: void __thiscall Circle::move(double,double)" (?move@Circle@@QAEXNN@Z)
    aufg3_2.obj : error LNK2001: unresolved external symbol "public: void __thiscall Point::move(double,double)" (?move@Point@@QAEXNN@Z)
    aufg3_3.obj : error LNK2001: unresolved external symbol "public: void __thiscall Point::move(double,double)" (?move@Point@@QAEXNN@Z)
    aufg3_1.obj : error LNK2019: unresolved external symbol "public: void __thiscall Point::print(bool)" (?print@Point@@QAEX_N@Z) referenced in function "public: void __thiscall Circle::print(bool)" (?print@Circle@@QAEX_N@Z)
    aufg3_2.obj : error LNK2001: unresolved external symbol "public: void __thiscall Point::print(bool)" (?print@Point@@QAEX_N@Z)
    aufg3_3.obj : error LNK2001: unresolved external symbol "public: void __thiscall Point::print(bool)" (?print@Point@@QAEX_N@Z)
    aufg3_1.obj : error LNK2019: unresolved external symbol "public: void __thiscall Point::init(double,double)" (?init@Point@@QAEXNN@Z) referenced in function "void __cdecl aufg3_1(void)" (?aufg3_1@@YAXXZ)
    aufg3_2.obj : error LNK2001: unresolved external symbol "public: void __thiscall Point::init(double,double)" (?init@Point@@QAEXNN@Z)
    D:\Studium\Informatik 3\Labor\INF3_Lab3\Labor 3\Debug\Labor 3.exe : fatal error LNK1120: 3 unresolved externals

    Das erste ist seltsam "already defined in aufg3_1.obj" Allerdings habe ich in der Aufgabe3_1 keine Methoden der Klassen definiert?

    Irgendwie weiß ich grad nicht mehr weiter.

    Wäre echt dankbar für ein Tip 😃

    Gruß mazeli



  • Wie wärs mit Include-Guards?



  • aja und guck dir mal Referenzen, const-correctness, Include-Guards, Initialisationlist, using namespace in header, operator<< overload usw an ...



  • Und um die Liste zu vervollständigen, werfe ich noch "inline" und "getrennte Übersetzung" in den Raum.

    (@Badestrand: Include-Guards sind ja ganz nützlich, helfen aber herzlich wenig gegen Linker-Fehler ;))



  • #if !defined (CIRCLE_H__INCLUDED)
    #define CIRCLE_H__INCLUDED
    
    #if (_MSC_VER >= 1300)
    #pragma once
    #endif // _MSC_VER >= 1300
    
    #include <iostream>
    #include "Point.h"
    #include "Shape.h"
    
    class circle : public shape
    {
        Point	m_centre;
        double	m_rad;
    
    public:
    	Circle() : m_centre(0, 0), m_rad(0.0) {}
    	Circle(Point const& pt, double rad) : m_centre(pt), m_rad(rad) {}
    
    	friend std::ostream& operator<<(std::ostream& out, circle const& data)
    	{ return ((out << "Circle [ " << data.m_centre << "; Radius(" << m_rad << ") ]")); }
    
    public:
    	void	move(double dx, double dy) { m_centre.move(dx, dy); }
    };
    
    #endif // CIRCLE_H__INCLUDED
    

    🙂 😛 so wäre das du viel besser 🙂


Log in to reply