2014-06-05 65 views
1

就像標題所說,我認爲我的一個包含問題。包括程序上的圖形界面

我很熟悉,我的老師給了我一個解決方案,創建一個名爲EZ-Draw的視覺界面(由他自己編碼)。

但地方在我的代碼有一個問題,因爲我的編譯器告訴我這種風格的許多錯誤:

|364|undefined reference to `[email protected]'| 
|559|undefined reference to `[email protected]'| 
... 

我的代碼:

interpreteur.hpp

#ifndef INTERPRETEUR_HPP_INCLUDED 
#define INTERPRETEUR_HPP_INCLUDED 
#include <sstream> 
#include <map> 
#include <math.h> 
#include "Pile_Template.hpp" 
#include "ez-draw++.h" 

#define PI 3.14159265 

class Interpreteur { 
private: 
    void (Interpreteur::*ptr)(); 
    EZWindow myWindow; 
    Pile<double> pile; 
    Pile<string> pilestr; 
    bool run; 
public: 
    map<string,void(Interpreteur::*)()> myMap; 
    Interpreteur(); 
    ~Interpreteur(); 
    inline bool getRun() {return run;}; 
    inline void setEmpilerPile(double nombre) {pile.empiler(nombre);}; 
    template <typename T> 
     string itos(T nombre) // convertit un double en string 
     { 
      ostringstream ss; 
      ss<<nombre; 
      return ss.str(); 
     } 
    void addition(); 
    void moins(); 
    void multiplie(); 
    void divise(); 
    void quit(); 
    void push(); 
    void pushstr(); 
    void pop(); 
    void popstr(); 
    void copy(); 
    void copystr(); 
    void print(); 
    void printstr(); 
    void display(); 
    void displaystr(); 
    void count(); 
    void countstr(); 
    void swap(); 
    void swapstr(); 
    void sinus(); 
    void cosinus(); 
    void tangente(); 
    void racine(); 
    void trunc(); 
    void line(); 
    void color(); 
    void drawstr(); 
    void triangle(); 
    void rectangle(); 
    void circle(); 

}; 
#endif // SOUS_PROGRAMMES_HPP_INCLUDED 

interpreteur.cpp

#include "interpreteur.hpp" 
#include <sstream> 
#include <map> 
#include <math.h> 
#include <string> 

using namespace std; 


void Interpreteur::addition() 
{ 
    pile.empiler(pile.depiler()+pile.depiler()); 
} 

void Interpreteur::moins() 
{ 
    double nombre=pile.depiler(); 
    nombre=pile.depiler()-nombre; 
    pile.empiler(nombre); 
} 

void Interpreteur::multiplie() 
{ 
    pile.empiler(pile.depiler()*pile.depiler()); 
} 

void Interpreteur::divise() 
{ 
    double nombre=pile.depiler(); 
    nombre=pile.depiler()/nombre; 
    pile.empiler(nombre); 
} 

void Interpreteur::quit() 
{ 
    run=false; 
} 

void Interpreteur::push() 
{ 
    double i; 
    cin>>i; 
    pile.empiler(i); 
} 

void Interpreteur::pushstr() 
{ 
    string chaine; 
    char merde; 
    cin>>merde; 
    if(merde=='"') 
    { 
     getline(cin,chaine,'"'); 
     pilestr.empiler(chaine); 
    } 
    else 
    { 
     cin.putback(merde); 
     cerr<<"mauvaise chaine de caractères"<<endl; 
    } 
} 

void Interpreteur::pop() 
{ 
    pile.depiler(); 
} 

void Interpreteur::popstr() 
{ 
    pilestr.depiler(); 
} 

void Interpreteur::copy() 
{ 
    int i=pile.depiler(); 
    pile.empiler(pile[pile.getSommet()-i]); 
} 

void Interpreteur::copystr() 
{ 
    int i=pile.depiler(); 
    pilestr.empiler(pilestr[pile.getSommet()-i]); 
} 

void Interpreteur::print() 
{ 
    cout<<pile.depiler()<<endl; 
} 

void Interpreteur::printstr() 
{ 
    cout<<pilestr.depiler()<<endl; 
} 

void Interpreteur::display() 
{ 
    pile.afficher(cout); 
} 

void Interpreteur::displaystr() 
{ 
    pilestr.afficher(cout); 
} 

void Interpreteur::count() 
{ 
    pile.empiler(pile.getSommet()); 
} 

void Interpreteur::countstr() 
{ 
    pilestr.empiler(itos(pilestr.getSommet())); 
} 

void Interpreteur::swap() 
{ 
    double first=pile.depiler(); 
    double second=pile.depiler(); 
    pile.empiler(first); 
    pile.empiler(second); 
} 

void Interpreteur::swapstr() 
{ 
    string first=pilestr.depiler(); 
    string second=pilestr.depiler(); 
    pilestr.empiler(first); 
    pilestr.empiler(second); 
} 

void Interpreteur::sinus() 
{ 
    pile.empiler(sin(pile.depiler()*PI/180)); 
} 

void Interpreteur::cosinus() 
{ 
    pile.empiler(cos(pile.depiler()*PI/180)); 
} 

void Interpreteur::tangente() 
{ 
    pile.empiler(tan(pile.depiler()*PI/180)); 
} 

void Interpreteur::racine() 
{ 
    pile.empiler(sqrt(pile.depiler())); 
} 

void Interpreteur::trunc() 
{ 
    int x=pile.depiler(); 
    pile.empiler(x); 
} 

void Interpreteur::line() 
{ 
    int y2=pile.depiler(); 
    int x2=pile.depiler(); 
    int y1=pile.depiler(); 
    int x1=pile.depiler(); 
    myWindow.drawLine(x1,y1,x2,y2); 
} 

void Interpreteur::color() 
{ 
    int couleur=pile.depiler(); 
    switch(couleur) 
    { 
     case 1:{myWindow.setColor(ez_black);break;} 
     case 2:{myWindow.setColor(ez_red);break;} 
     case 3:{myWindow.setColor(ez_green);break;} 
     case 4:{myWindow.setColor(ez_blue);break;} 
     case 5:{myWindow.setColor(ez_cyan);break;} 
     case 6:{myWindow.setColor(ez_magenta);break;} 
     case 7:{myWindow.setColor(ez_yellow);break;} 
     //pourquoi que on a pas fait le gris ? ez_grey 
     default:{pile.empiler(couleur); cerr<<"couleur inconnue"<<endl; break;} 
    } 
    // COULEUR : ez_black, ez_white, ez_grey, ez_red, ez_green, ez_blue,ez_yellow, ez_cyan, ez_magenta 

} 

void Interpreteur::drawstr() 
{ 
    string str=pilestr.depiler(); 
    int y1=pile.depiler(); 
    int x1=pile.depiler(); 
    myWindow.drawText(EZ_MC,x1,y1,str); 
} 

void Interpreteur::triangle() 
{ 
    int y3=pile.depiler(); 
    int x3=pile.depiler(); 
    int y2=pile.depiler(); 
    int x2=pile.depiler(); 
    int y1=pile.depiler(); 
    int x1=pile.depiler(); 
    myWindow.drawTriangle(x1,y1,x2,y2,x3,y3); 
} 

void Interpreteur::rectangle() 
{ 
    int y2=pile.depiler(); 
    int x2=pile.depiler(); 
    int y1=pile.depiler(); 
    int x1=pile.depiler(); 
    myWindow.drawRectangle(x1,y1,x2,y2); 
} 

void Interpreteur::circle() 
{ 
    int y2=pile.depiler(); 
    int x2=pile.depiler(); 
    int y1=pile.depiler(); 
    int x1=pile.depiler(); 
    myWindow.drawCircle(x1,y1,x2,y2); 
} 

Interpreteur::Interpreteur() 
{ 
    run=true; 
    myMap["+"]=&Interpreteur::addition; 
    myMap["-"]=&Interpreteur::moins; 
    myMap["*"]=&Interpreteur::multiplie; 
    myMap["/"]=&Interpreteur::divise; 
    myMap["exit"]=&Interpreteur::quit; 
    myMap["push"]=&Interpreteur::push; 
    myMap["pushstr"]=&Interpreteur::pushstr; 
    myMap["pop"]=&Interpreteur::pop; 
    myMap["popstr"]=&Interpreteur::popstr; 
    myMap["copy"]=&Interpreteur::copy; 
    myMap["copystr"]=&Interpreteur::copystr; 
    myMap["print"]=&Interpreteur::print; 
    myMap["printstr"]=&Interpreteur::printstr; 
    myMap["display"]=&Interpreteur::display; 
    myMap["displaystr"]=&Interpreteur::displaystr; 
    myMap["count"]=&Interpreteur::count; 
    myMap["countstr"]=&Interpreteur::countstr; 
    myMap["swap"]=&Interpreteur::swap; 
    myMap["swapstr"]=&Interpreteur::swapstr; 
    myMap["sin"]=&Interpreteur::sinus; 
    myMap["cos"]=&Interpreteur::cosinus; 
    myMap["tan"]=&Interpreteur::tangente; 
    myMap["sqrt"]=&Interpreteur::racine; 
    myMap["trunc"]=&Interpreteur::trunc; 
    myMap["line"]=&Interpreteur::line; 
    myMap["color"]=&Interpreteur::color; 
    myMap["drawstr"]=&Interpreteur::drawstr; 
    myMap["triangle"]=&Interpreteur::triangle; 
    myMap["rectangle"]=&Interpreteur::rectangle; 
    myMap["circle"]=&Interpreteur::circle; 
} 

Interpreteur::~Interpreteur() 
{ 
    map<string, void (Interpreteur::*)()>::iterator it; 
    myMap.erase(it); 
} 

這裏的"EZ-Draw documentation"紅粉由我的老師瞭解ez-drawez-draw++

我不明白編譯器是想告訴我

+0

您可能要編輯您的帳戶說明,法語中的「étudiant」用英語拼寫爲「學生」。 –

回答

1

您正在使用C函數從C++,對於這你需要明確地告訴編譯器這些是C函數。你選自C使用C頭文件++應包含這些行爲可用在C++:

#ifdef __cplusplus 
extern "C" { 
#endif 

//The header file which declares the functions which are not linked correctly here 

#ifdef __cplusplus 
} 
#endif 

的解釋的位:
函數「名稱重整」是C和C++不同,因爲在C++中你可以重載一個函數,函數的名字本身並不能唯一地標識一個函數,所以當你編譯時,編譯器會在後臺函數的名字中添加一些符號以使這些名稱唯一(這就是[email protected]中的[email protected])。

因爲你的連接預計C++函數,它將搜索[email protected],但某些文件被編譯在C,並導出一個名爲CreateCompatible功能,這就是爲什麼你會得到一個「未定義參考」:鏈接器告訴你它找不到某些功能的定義。

+0

好的,但是我把剛纔寫的代碼片段放在裏面:'#ifdef __cplusplus extern「C」{...} #endif' –

+0

在頭文件的開始和結尾聲明函數給你錯誤信息。 –