Reply to this topicStart new topic
> [RESOLU][C++] Unresolved symbols, oukèlélerreur?
Berzehk
posté 27/10/2009, 20:42
Message #1


Lord Jedi Geek
****

Groupe : Membre
Messages : 581
Inscrit : 24/3/05
Lieu : Fontainebleau ou Paris
Membre no 11 619



Bonsoir la zone,

J'essaie de faire un code Cplouchplouch ultra propre et ultra relou pendant la compilation, histoire qu'il m'emmerde dès que je fais une erreur .
J'ai déja un code de base, et j'ai "tuné" qqes opérateurs sur une classe 'Color'.


Color.h
Code
class Color
{
    protected:
        double m_R,m_G,m_B;
        double m_A;            // composante alpha
    public:
        Color();
        Color(double R,double G,double B,double A = 1);
        double GreyLevel() const;
        Color(const Color &color);
        virtual ~Color();

        Color &operator = (const Color& color);
        inline const Color  operator + (const Color &color) const; //voila les 4 operateurs
        inline const Color  operator - (const Color &color) const; // que j'ai bidouillés
        inline const Color  operator * (double a) const;              // en rajoutant inline const  ... (const) const
        inline const Color  operator * (const Color & color) const;
        inline const Color  operator / (double a) const;

        COLORREF    REF();  // code Color de windows
};


implémentés comme suit:

Color.cpp
Code
inline const Color Color::operator+(const Color &rhs) const
{
    return Color(m_R + rhs.m_R,
                m_G + rhs.m_G,
                m_B + rhs.m_B,
                m_A + rhs.m_A);
}

inline const Color Color::operator*(double rhs) const
{
    return Color(m_R*rhs,
                m_G*rhs,
                m_B*rhs,
                m_A*rhs);
}

et je les utilise dans une autre classe comme ceci:

Texture.cpp
Code
const Color Texture::Interpol(double x,double y) const
{
    int xx,yy;
    double cx,cy;
    double ccx,ccy;

    while ( x < 0 ) x += m_wWidth;
    while ( y < 0 ) y += m_wHeight;
    while ( x >= m_wWidth ) x -= m_wWidth;
    while ( y >= m_wHeight ) y -= m_wHeight;

    xx = int(x);
    yy = int(y);

    cx=x-xx;
    cy=y-yy;

    ccx=cx*cx;
    ccy=cy*cy;

    return      GetColor(xx  ,yy  ) * (1-ccx)*(1-ccy)
            +    GetColor(xx+1,yy  ) * ccx*(1-ccy)
            +    GetColor(xx  ,yy+1) * (1-ccx)*ccy
            +    GetColor(xx+1,yy+1) * ccx*ccy;
}


Et voila que le compilateur me sort ces deux erreurs que j'ai djà un peu de mal a lire, et je ne trouve pas ce qu'il a à me reprocher:
  • Error 1 error LNK2019: unresolved external symbol "public: class Color const __thiscall Color::operator+(class Color const &)const " (??HColor@@QBE?BV0@ABV0@@Z) referenced in function "protected: class Color const __thiscall Texture::Interpol(double,double)const " (?Interpol@Texture@@IBE?BVColor@@NN@Z) texture.obj Projet IMA
  • Error 2 error LNK2019: unresolved external symbol "public: class Color const __thiscall Color::operator*(double)const " (??DColor@@QBE?BV0@N@Z) referenced in function "protected: class Color const __thiscall Texture::Interpol(double,double)const " (?Interpol@Texture@@IBE?BVColor@@NN@Z) texture.obj Projet IMA


Pourquoi il ne prend pas mes opérateurs?

EDIT: ajout extrait Color.cpp

Ce message a été modifié par Berzehk - 27/10/2009, 21:15.


--------------------
Donnez la puissance inutilisée de votre bête de course pour la recherche
Go to the top of the page
 
+Quote Post
AnA-l
posté 27/10/2009, 21:00
Message #2


Tullius Detritus
*******

Groupe : Membre
Messages : 4 917
Inscrit : 2/3/06
Lieu : Rbx
Membre no 13 395
Steam : AnA-l
Xbox Live : jbriguet



inline et const c'est pas incompatible ? Sans l'un ou l'autre ca passe pas mieux ?


--------------------

Go to the top of the page
 
+Quote Post
Berzehk
posté 27/10/2009, 21:14
Message #3


Lord Jedi Geek
****

Groupe : Membre
Messages : 581
Inscrit : 24/3/05
Lieu : Fontainebleau ou Paris
Membre no 11 619



lequel ? le 1er const du type de retour, le const sur la fonction, ou sur le paramètre?


Je vais tester dès que tu me réponds, mais j'espère pas que c'est ca, car j'en ai pleins dans le livre que je lis en ce moment et qui est censé être ZE référence (Effective C++, Scott Meyers)

EDIT: si je dégage le inline, ca marche parfaitement, mais si je pouvais éviter, ca serait top.


Quel est le const en trop et pquoi est il incompatible, du coup? oO

oohhhh j'ai pigé!

Les fonctions inline doivent déclarées ET definies dans le header et non dans le cpp. Sinon ca resoud pas les symboles. Aucune idée de pourquoi (et je trouve ca assez peu élégant), mais ok.

Merci AnA-l=)

Ce message a été modifié par Berzehk - 27/10/2009, 21:15.


--------------------
Donnez la puissance inutilisée de votre bête de course pour la recherche
Go to the top of the page
 
+Quote Post
Doc Toise
posté 27/10/2009, 22:11
Message #4


Padawan Geek
**

Groupe : Membre
Messages : 78
Inscrit : 19/9/05
Lieu : Chuiche
Membre no 12 546



Citation (Berzehk @ 27/10/2009, 21:14) *
Les fonctions inline doivent déclarées ET definies dans le header et non dans le cpp. Sinon ca resoud pas les symboles. Aucune idée de pourquoi (et je trouve ca assez peu élégant), mais ok.

Lorsque tu compiles un fichier .cpp faisant appel à une fonction inline, le compilateur doit insérer le code de ta fonction inline à la place de l'appel à la fonction. Pour ça il faut qu'il ait accès à la définition de ta fonction, qui doit être connue du .cpp que tu compiles (donc se trouver dans un header). Il en est de même avec les templates. C'est pas focément l'idéal pour isoler le client du header de l'implémentation des fonctions, mais l'inlining est à ce prix.

Et je confirme, le bouquin de Scott Meyers (en fait la série, de Effective C++ à Effective STL en passant par More Effective C++) est excellent. Je dirais pas que c'est une référence du langage (c'est pas même but que les bouquins de Stroutstrup ou celui de Josuttis pour la STL), mais c'est une fantastique compilation de best practices que tout programmeur C++ se doit de connaître. Clairement indispensable.
Go to the top of the page
 
+Quote Post
AnA-l
posté 27/10/2009, 22:52
Message #5


Tullius Detritus
*******

Groupe : Membre
Messages : 4 917
Inscrit : 2/3/06
Lieu : Rbx
Membre no 13 395
Steam : AnA-l
Xbox Live : jbriguet



Oui, en fait, c'est effectivement pas le const qui posait souci mais le inline, qui fonctionne comme un #define dans le fond. Et +1 doc_toise, on les a au taff, c'est des references de bonnes practices.


--------------------

Go to the top of the page
 
+Quote Post
c0unt0
posté 29/10/2009, 20:42
Message #6


Build succeeded !
****

Groupe : Modérateurs
Messages : 983
Inscrit : 2/4/02
Lieu : edinburgh
Membre no 60



oui, inline tout ca, dans le cpp pas bien... Le truc rigolo c'est que j'ai fixe le meme bug dans notre code y a pas 3 jours wink.gif
Par contre, ca:
CODE
while ( x < 0 ) x += m_wWidth;
while ( y < 0 ) y += m_wHeight;
while ( x >= m_wWidth ) x -= m_wWidth;
while ( y >= m_wHeight ) y -= m_wHeight;


C'est super cracra!


--------------------
c0unt0
Hey, nice marmot!
Go to the top of the page
 
+Quote Post
Berzehk
posté 29/10/2009, 22:14
Message #7


Lord Jedi Geek
****

Groupe : Membre
Messages : 581
Inscrit : 24/3/05
Lieu : Fontainebleau ou Paris
Membre no 11 619



pas mon code biggrin.gif je me contente de changer qqes trucs au fur et a mesure de mes lectures.
Je ferais bien remonter la chose, mais vu que l'auteur est aussi celui qui me note (erm)... J'attendrais d'etre diplomé tongue.gif


J'ai encore qqes soucis (nottamment sur les exceptions chez VC++, j'essaie d'empecher la creation d'un objet mais je recupere bcp de warnings lors de la compilation) mais je posterais ca demain matin.


--------------------
Donnez la puissance inutilisée de votre bête de course pour la recherche
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 

  RSS Version bas débit Nous sommes le : 9/2/10 - 10:33