Ich komme nicht auf meinen Fehler! Bitte helft mir!!!

  • ich bekomme immer folgenden fehler:

    Beispiel error LNK2019: Nicht aufgelöstes externes Symbol '"public: int __thiscall CPoint::GetX(void)const " (?GetX@CPoint@@QBEHXZ)', verwiesen in Funktion '"public: int __thiscall CRectangle::GetUpperLeft(void)" (?GetUpperLeft@CRectangle@@QAEHXZ)'

    Beispiel fatal error LNK1120: 1 unaufgelöste externe Verweise


    ich poste euch jetzt mal meinen code und dann sage ich wo ich ein problem habe!
    -------------------------------------------
    CPoint.h
    -------------------------------------------
    class CPoint
    {
    public:
    void SetX(int x);
    void SetY(int y);

    inline int GetX() const;
    inline int GetY() const;

    private:
    int m_x;
    int m_y;
    };
    -------------------------------------------
    CPoint.cpp
    -------------------------------------------
    #include "CPoint.h"

    void CPoint::SetX(int x)
    {
    m_x = x;
    }

    void CPoint::SetY(int y)
    {
    m_y = y;
    }

    inline int CPoint::GetX() const
    {
    return m_x;
    }

    inline int CPoint::GetY() const
    {
    return m_y;
    }
    -------------------------------------------
    CRectangle.h
    -------------------------------------------
    #include "CPoint.h"

    class CRectangle
    {
    public:
    CRectangle(int top, int left, int bottom, int right);
    ~CRectangle();

    int GetUpperLeft();

    private:
    int m_top;
    int m_left;
    int m_bottom;
    int m_right;

    CPoint m_UpperLeft;
    CPoint m_UpperRight;
    CPoint m_LowerLeft;
    CPoint m_LowerRight;
    };
    -------------------------------------------
    CRectangle.cpp
    -------------------------------------------
    #include "CRectangle.h"

    CRectangle::CRectangle(int top, int left, int bottom, int right)
    {
    m_top = top;
    m_left = left;
    m_bottom = bottom;
    m_right = right;

    m_UpperLeft.SetX(left);
    m_UpperLeft.SetY(top);

    m_UpperRight.SetX(left);
    m_UpperRight.SetY(top);

    m_LowerLeft.SetX(left);
    m_LowerLeft.SetY(bottom);

    m_LowerRight.SetX(left);
    m_LowerRight.SetY(bottom);
    }

    CRectangle::~CRectangle() {}

    int CRectangle::GetUpperLeft()
    {
    return m_UpperLeft.GetX();
    }
    -------------------------------------------
    Main.cpp
    -------------------------------------------
    #include <iostream>
    #include "CRectangle.h"

    using namespace std;

    int main()
    {
    CRectangle myRectangle (100, 20, 50, 80);

    cout << myRectangle.GetUpperLeft();
    cin;

    return 0;
    }

    /////////////

    Immer wenn ich auf myRectangle.GetUpperLeft(); zugreifen möchte funktioniert es nicht und ich komme nicht auf meinen Fehler!

    Bitte helft mir!!!

    :oops:

  • Hi,

    Vorab:
    -------
    wenn Du alle 'inline'-Qualifier weglässt, lässt sich das Programm ohne Fehler binden.
    Da es 'inline' ohnehin nur zur Performance-Steigerung gibt, d.h. keine funktionalen Effekte hat, ist Dein Problem vielleicht schon gelöst, wenn Du darauf einfach verzichtest.

    Wenn Du es aber trotzdem machen willst, dann verstehe ich das so:
    ------------------------------------------------------------------------------
    In der CPoint.h wird mit "inline int GetX() const;" versprochen, daß es eine GetX-Definition geben wird.
    In CRectangle.cpp rufst Du GetX dann ja auf.
    Der Linker stellt aber nun fest, daß GetX gar nicht definiert wurde, obwohl Du es ja in CPoint.cpp gemacht hast!

    Wie das?
    Nun, ich denke, daß die inline-Angabe in der .cpp bewirkt, daß der dort angegebene Code an den Stellen des Aufrufes sofort expandiert eingefügt wird und somit gar keine echte Definition für das Gegenstück in der .h entsteht.

    Lösung:
    Die Implementierung wird in der .h-Headerdatei vorgenommen.
    In der .cpp taucht die Funktion dann gar nicht mehr auf.
    Beispiel in der CPoint.h:
    inline int GetX() const
    {
    return m_x;
    };

    Gruß
    Paddy

  • Hallo

    Wenn inline, dann immer alles in den header. Dann gibt es auch keine Problem.

    chrische