2011-10-11 92 views
-1

我正在閱讀這本名爲「C++ How to Program」的書,來自Deitel,我仍然是這方面的初學者。我瞭解Java,所以我正在嘗試熟悉C++語法以及它的工作原理。C++初學者分段錯誤

我的代碼如下:

文件>> gradebook_interface.h

#include <string> 
//#include <unordered_map> 
using namespace std; 

//specifing interface 

class gradebook_interface 
{ 
    public: 
     //constructor 
     gradebook_interface(string); 
     void reset_Coursename(); 
     void setCoursename(string); 
     string getCourseName(); 
     void displayMessage(); 
     void add_to_hashmap(string,int); 

    private: 
     //hashmap init 
     //unordered_map <string, int> course_map; 
     string courseName; 
}; 

文件>> gradebook_interface.cpp

#include <iostream> 
//including interface "gradeinterface" 
#include "gradebook_interface.h" 

using namespace std; 

    //constructor from interface 
    gradebook_interface::gradebook_interface(string name) 
    { 
     setCoursename(name); 
    } 

    void gradebook_interface::setCoursename (string name) 
    { 
     courseName = name; 
    } 

    string gradebook_interface::getCourseName() 
    { 
     return courseName; 
    } 

    void gradebook_interface::displayMessage() 
    { 
     cout << "First C++ application\n" << getCourseName() << "!" << endl; 
    } 

    //interfac's methods 
    void gradebook_interface::reset_Coursename() 
    { 
     courseName = "null"; 
     cout << "The course name has been reseted! Value is: " << getCourseName() << endl; 
    } 

    void gradebook_interface::add_to_hashmap(string, int) 
    { 
     //course_map["test_course"] = 14; 
     //cout << "Hashmap value just entered:" << endl; 
     //cout << course_map["test_course"] << endl; 

    } 

文件>> gradebook_main.cpp

#include <iostream> 
#include "gradebook_interface.h" 

using namespace std; 

int main() 
{ 
    gradebook_interface gradebook_1 ("Maths"); 
    gradebook_interface gradebook_2 ("Greek"); 

    cout << "gradebook 1 " << gradebook_1.getCourseName() << endl; 
    cout << "gradebook 2 " << gradebook_2.getCourseName() << endl; 

}; 

本書使用Visual Studio,因爲我在Ubuntu上不能使用。 我在某處讀到,如果您使用「gcc」編譯C++代碼,它會自動調用「g ++」。 但我得到一個錯誤,所以我不得不使用g ++。 我的第一個問題是,我可以使用gcc(需要任何參數嗎?)? 我的第二個問題是,鏈接器是如何工作的? 我的第三個問題是爲什麼當我嘗試運行這個時會出現分段錯誤?

感謝

+5

1)gcc用於c代碼,g ++用於C++代碼。 2)編譯器將源代碼轉換爲目標代碼,鏈接器將目標代碼綁定到可執行文件中。 3)請張貼你的seg故障。 – Nate

+4

看起來你正在遭受多個不相關的問題。也許最好把它們逐個整理出來。你真的得到段錯誤嗎?代碼看起來不錯。確保你正在編譯正確的東西... –

+0

你會得到什麼錯誤,當你遇到段錯誤時,堆棧跟蹤是什麼樣的?代碼看起來沒問題,只是粗略一瞥。 – Chad

回答

2

我沒有問題,這樣編譯程序:

g++ -O2 -g main.cpp gradebook_interface.cpp -o main 

其實我用下面的Makefile

all: main 

main: main.cpp gradebook_interface.cpp 
    g++ -O2 -g $^ -o [email protected] 

和簡單的發出make && ./main輸出:

gradebook 1 Maths 
gradebook 2 Greek 

我在valgrind下運行它;至今沒有檢測到內存錯誤。 我沒有你的代碼

編輯看着How does the linker work部分:

如果你改寫了那個Makefile中像這樣:

all: main 

CPPFLAGS+=-O2 -g 

main: main.o gradebook_interface.o 
    g++ $(CPPFLAGS) $^ -o [email protected] 

這將導致下面的生成步驟:

g++ -O2 -g -c -o main.o main.cpp 
g++ -O2 -g -c -o gradebook_interface.o gradebook_interface.cpp 
g++ -O2 -g main.o gradebook_interface.o -o main 

,它顯示瞭如何與鏈接步驟分開進行編譯步驟(-c)。在這種情況下,鏈接步驟可以寫爲ld intead的明確調用,但您必須自己指定libgcc和libstdC++的運行時庫