2010-08-17 8 views
2

J'écris un programme de fenêtre GTKmm; la fenêtre principale crée deux boutons, un pour l'anglais et un pour le chinois. L'utilisateur peut cliquer sur le bouton pour faire apparaître une fenêtre différente dans la langue appropriée. Actuellement, j'ai du mal à initialiser le conteneur multi-éléments dans la fenêtre principale. C'est un objet de type MainWindowPane, qui hérite de Gtk :: HBox.référence non définie à `Class :: Class() '

Lorsque je tente de faire, le compilateur émet l'erreur suivante:

$ make 
g++ -g `pkg-config gtkmm-2.4 --cflags` -c MainWindow.cpp 
g++ -g -o QPI_frontend main.o MainWindow.o StartButton.o `pkg-config gtkmm-2.4 --libs` 
MainWindow.o: In function `MainWindow': 
/home/dmurvihill/Documents/QPI_frontend/MainWindow.cpp:9: undefined reference to `MainWindowPane::MainWindowPane()' 
/home/dmurvihill/Documents/QPI_frontend/MainWindow.cpp:9: undefined reference to `MainWindowPane::MainWindowPane()' 
collect2: ld returned 1 exit status 
make: *** [QPI_frontend] Error 1 

J'utilise la dernière version de gcc avec pkg-config pour inclure les bibliothèques appropriées. Je suis aussi une personne java.

/* 
* MAIN_WINDOW.H 
* Responsible for creating "slave" RSED windows. Can create English or Chinese 
* versions of the demo, and can destroy them all with one click. 
*/ 
#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <gtkmm/window.h> 

//#include "SlaveWindow.h" 
#include "StartButton.h" 
#include "MainWindowPane.h" 

class MainWindow : public Gtk::Window 
{ 
public: 
    MainWindow(); 
private: 
    MainWindowPane pane; 
// std::list<SlaveWindowThread> windows;  // Keeps track of all windows that have been created thus far. 
    void destroyAllWindows();   // Iterates through the linked list and destroys each window. 
}; 
#endif  //ifndef MAINWINDOW_H 

/* 
* MAIN_WINDOW.CPP 
* 
*/ 
#include "MainWindow.h" 
#include "MainWindowPane.h" 
#include "StartButton.h" 

MainWindow::MainWindow()// : /*list,*/ pane(/*list*/) 
{ 
    pane; 
} 

void MainWindow::destroyAllWindows() 
{ 
    //gtk_widget_destroy(*this); 
    // TODO: Destroy all the other windows too. 
} 

/* 
* MAIN_WINDOW_PANE.H 
*/ 
#ifndef MAINWINDOWPANE_H 
#define MAINWINDOWPANE_H 

#include <gtkmm/box.h> 
#include <gtkmm/button.h> 

//#include "SlaveWindow.h" 
#include "StartButton.h" 

class MainWindowPane : public Gtk::HBox 
{ 
public: 
    MainWindowPane(/*&(std::list)*/); 
private: 
    StartButton englishButton;  // Used to create a new RSED demo screen. 
    StartButton chineseButton;  // Used to create a new RSED demo in chinese. 
// std::list<SlaveWindow> windows;  // Keeps track of all windows that have been created thus far. 
    void destroyAllWindows();  // Iterates through the linked list and destroys each window. 
}; 
#endif  //ifndef MAINWINDOWPANE_H 

/* 
* MAIN_WINDOW.CPP 
* 
*/ 
#include "MainWindowPane.h" 
#include "StartButton.h" 

MainWindowPane::MainWindowPane(/*&(std::list)*/) : 
    englishButton(StartButton::ENGLISH/*,&(std::list)*/), 
    chineseButton(StartButton::CHINESE/*,&(std::list)*/) 
{ 
    pack_start(englishButton); 
    englishButton.show(); 
    pack_start(chineseButton); 
    chineseButton.show(); 
} 

void MainWindow::destroyAllWindows() 
{ 
    //gtk_widget_destroy(*this); 
    // TODO: Destroy all the other windows too. 
} 

Répondre

8

erreurs de référence non définie vous dire soit oublié d'écrire définir la fonction manquante (en écrivant une implémentation dans le fichier .cpp), ou vous avez oublié de lier le fichier objet approprié ou la bibliothèque dans le fichier binaire final.

Dans ce cas, c'est la raison la plus tardive. Vous devez inclure MainWindowPane.o dans la commande éditeur de liens dans votre makefile:

g++ -g -o QPI_frontend main.o MainWindow.o StartButton.o `pkg-config gtkmm-2.4 --libs` 
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
         you need MainWindowPane.o in here 
+1

C'est tout. Ajouté la source à mon makefile, et le code compilé avec succès. Merci! Maintenant, sur le débogage d'exécution ... – ILikeFood

+0

@ILikeFood, n'oubliez pas de cocher la case à côté de la réponse qui a fonctionné pour que vous acceptiez la réponse. –

+0

Ahh, merci. J'ai aussi essayé de voter, mais mon compte est trop nouveau. – ILikeFood

0

Il se plaint que vous essayez d'appeler un constructeur par défaut pour MainWindowPane qui n'existe pas.

Je pense que MainWindowPane ne définit que cteurs avec des paramètres, et que vous utilisez comme une classe de base, et vous ne soit pas défini cteur pour la classe dérivée, ou cteur vous ne définissaient n'a pas appelle la base avec les paramètres.

class MyDerived : public MainWindowPane 
{ 
    public: 
     MyDerived() {....} // bad 

     MyDerived(int x) : MainWindowPane(x) // good 
      {....} 

MISE À JOUR:

OK, ignorer ce qui précède (écrit avant le code posté). Il semble se plaindre de cette ligne »

MainWindow::MainWindow()// : /*list,*/ pane(/*list*/) 
{ 
    pane;  // Error HERE. 
} 

Et je ne sais vraiment pas ce que l'objectif de cette ligne est. Vous référencez juste un membre de données, sans faire quoi que ce soit avec lui. Il peut probablement être supprimé.

MAJ2: pane sera construit par défaut si vous ne faites rien:

MainWindow::MainWindow() 
{ 
} 
+0

j'oublié de mettre dans mon code au début. Oops! J'ai modifié cela maintenant. Vous pouvez voir que les deux constructeurs j'ai défini le constructeur par défaut pour MainWindowPane dans le fichier cpp. Espérons que le code le rend un peu plus clair. J'ai l'impression de faire une erreur triviale sur la syntaxe quelque part (quelque chose qui est facile à intégrer pour les programmeurs Java!). – ILikeFood

+0

Cette ligne était une tentative d'appel du constructeur par défaut pour le volet.Je rencontre une erreur différente avec le volet(); J'ai déplacé l'appel de constructeur tenté dans le corps de la fonction parce que j'ai rencontré la même erreur lorsque j'ai essayé d'appeler le volet dans la liste d'initialisation. J'ai ensuite oublié de le reculer. Je reçois la même erreur avec ce code: ... MainWindow :: MainWindow(): volet() { } . Avec ce code: MainWindow :: MainWindow(): volet {} ... Je reçois cette erreur: MainWindow.cpp: 9: avertissement: listes d'initialisation étendues disponibles uniquement avec -std = C++ 0x ou - std = gnu ++ 0x '... Merci pour votre aide jusqu'à maintenant. – ILikeFood