2010-08-17 65 views
2

我正在寫一個GTKmm窗口程序;主窗口會創建兩個按鈕,一個用於英文,一個用於中文。用戶可以點擊按鈕以合適的語言顯示不同的窗口。目前,我在初始化主窗口中的多項目容器時遇到問題。它是MainWindowPane類型的一個對象,它繼承了Gtk :: HBox。未定義的引用`Class :: Class()'

當我嘗試做,編譯器會發出以下錯誤:

$ 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 

我使用的是最新版本的pkg配置的gcc來包含適當的庫。我也是一個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. 
} 

回答

8

未定義引用錯誤意味着你要麼 忘了寫定義缺失的功能 (通過在.cpp文件中寫入實現), ,或者您忘記將相應的目標文件或庫鏈接到最終的二進制文件中。

在這種情況下,這是後面的原因。 您需要在連接器命令MainWindowPane.o在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

就是這樣。將源代碼添加到我的生成文件中,並且代碼編譯成功。謝謝! 現在,在運行時調試... – ILikeFood 2010-08-17 21:20:23

+0

@ILikeFood,記得點擊答案旁邊的複選標記,以便接受答案。 – 2010-08-17 21:32:17

+0

啊,謝謝。我也試圖把它投票,但我的想法太新了。 – ILikeFood 2010-08-17 21:51:28

0

它的抱怨,你正試圖呼籲MainWindowPane一個默認的構造不存在。

我的猜測是,MainWindowPane只定義了參數構建函數,並且您正在使用它作爲一個基類,你要麼不定義構造函數派生類,或者你沒有定義構造函數沒有用參數調用基地。

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

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

UPDATE:

OK,忽略上述(您發佈的代碼之前寫的)。這似乎是在抱怨這條線」

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

我真的不知道該行的目的是什麼。你只是引用數據成員,沒有做任何事的。這或許可以被刪除。

UPDATE2: pane將默認構造,如果你什麼都不做:

MainWindow::MainWindow() 
{ 
} 
+0

我忘了把我的代碼在第一。哎呀! 我已經編輯過了。你可以看到,我已經在cpp文件中定義了MainWindowPane的默認構造函數。 希望代碼使它更清晰一點。我覺得我在某處的語法上犯了一些微不足道的錯誤(對於Java程序員來說,這很容易實現!)。 – ILikeFood 2010-08-17 21:00:07

+0

該行嘗試調用窗格的默認構造函數。我遇到與pane()不同的錯誤; 我將嘗試構造函數調用移入函數體中,因爲我試圖在初始化程序列表中調用窗格時遇到了相同的錯誤。我後來忘了把它移回去。我得到了與此代碼相同的錯誤:... MainWindow :: MainWindow():pane() { } 。使用此代碼: MainWindow :: MainWindow():pane {} ... 我收到此錯誤: MainWindow.cpp:9:warning:擴展初始化程序列表僅在-std = std = gnu ++ 0x'... 感謝您的所有幫助。 – ILikeFood 2010-08-17 21:13:09

相關問題