2012-08-08 98 views
1

我想構建一個對象,然後將其中一個變量設置爲一個值。使用指針/類的設置方法

類的頭:

class Book { 
public: 
Book(); 
Book(string newSelection); 
string getSelection(); 
string setSelection(string newSelection); 

private: 
string selection; 
} 

級CPP

Book::Book() {} 

Book::Book(string newSelection) { 
selection = newSelection; 
} 


string Book::getSelection(){ 
return selection; 
} 

string Book::setSelection(string newSelection){ 
selection = newSelection; 
} 

驅動

Book* book1 = new Book(); 
book1->setSelection("The Book Title"); 
cout << "Book selected: " << book1->getSelection() << endl; 

我得到一個segmentat離子故障,我不知道爲什麼。有人能指出我的問題可能在哪裏嗎?

+2

此代碼看起來完全正常。你確定這是所有?這給你seg-fault? – 2012-08-08 16:28:47

+0

嘗試一下沒有指針,所以Book book1;然後book1.setSelection(「書名」);那樣有用嗎?你還記得包括字符串?但是,你的代碼很好,它應該工作。 – Annabelle 2012-08-08 16:30:09

+1

您在頭文件的類定義中的'}'後面也缺少一個';',但這應該成爲編譯器錯誤 – learnvst 2012-08-08 16:31:43

回答

2

setSelection()函數聲明爲返回一個字符串,但實際上正在沒有返回的字符串。你至少應該得到一個編譯警告。

從調試器中運行這個,我相信發生了什麼是在調用setSelection()後,在返回的字符串上調用析構函數。由於該字符串並不存在,因此運行時會導致abort()

作爲一般規則,「二傳手往往不如下返回任何東西,因此我們將寫成:

void setSelection(const string& newSelection); 

...

void Book::setSelection(const string& newSelection) 
{ 
    selection = newSelection; 
} 

也注意到,該字符串被傳遞常量引用而不是價值更有效。這不會是你的問題的原因。

另一個建議是,以確保您「消氣」被聲明爲const,因爲它沒有在對象改變什麼:

string getSelection() const; 

...

string Book::getSelection() const 
{ 
    return selection; 
} 
+0

嗯..返回值從來沒有使用過,但仍然 - 你可能是對的? – 2012-08-08 16:37:18

+0

我剛剛完成了。我花了一個多小時看着這個。是的......問題是在setSelection函數中返回一個字符串。我將其改爲無效,並且可行!好極了。謝謝大家:) – CocaCola 2012-08-08 16:38:16

+0

比科學更直觀。當我編譯它時足夠了我得到了'警告:控制達到了非空函數的末尾,這正是我期望的。我通過gdb運行它,並根據我發現的內容在上面添加了我的想法。 – 2012-08-08 16:50:54

1

setSelection方法被定義爲返回一個字符串,但它沒有返回任何東西。也許增加一個return語句(或者將其更改爲無效)會解決這個問題:

string Book::setSelection(string newSelection){ 
    selection = newSelection; 
    return selection; 
} 
+0

編譯器無需警告未返回值,因爲它通常是很難判斷所有路徑是否可達。 – ecatmur 2012-08-08 16:39:46

+0

@ecatmur:好點。我刪除了那句話。 – 2012-08-08 16:44:18