2017-02-05 43 views
1

我一直被困在這一個問題上,也許有人能解釋給我?我沒有提供我的確切代碼,但是我想要實現的類似情況(以及縮短的版本)。這是一個餐廳模擬器。指定一個指針的字符串引用

int main() { 
    Restaurant i; 
    string tableID; 
    cin >> tableID; 
    i.append(new Table(tableID));//this appends a new table to the linked list 
} 
//.h file we're not allowed to modify 
class Table 
{ 
public: 
    Table(const string& tableID);//constructor 
private: 
    string* tableID; 
} 
// .cpp file I'm writing 
Table::Table(const string& tableID){ 
    this->tableID = tableID; 
} 

,我發現了錯誤:

table.cc:9:18: error: cannot convert ‘const string {aka const std::__cxx11::basic_string}’ to ‘std::__cxx11::string* {aka std::__cxx11::basic_string*}’ in assignment this->tableID = tableID;

誰能告訴我這是怎麼回事?對我來說,它似乎將tableID的地址傳遞給main(),並將它分配給構造函數中的一個指針,我認爲這是合法的,但也許是const將我拋棄。

+0

那麼,錯誤消息似乎很清楚。您試圖將一個「string」類型的表達式賦值給一個類型爲「指向string的指針」的變量。它不會出於同樣的原因'int * p = 42;'不起作用 - 兩者都沒有意義。 –

+0

是的,我認爲這是它,但我無法弄清楚我將如何將該字符串轉換爲指針。 – Mike1982

回答

1

有幾個選項:

  1. 變化Table類的tableID定義是string tableID。在這種情況下,您將保留實例中值的副本。

  2. 將作業更改爲this->tableIDthis->tableID = &tableID。在這種情況下,您需要將tableID參數的地址分配給this->tableID。在這種情況下,只會在實例中保留一個指向表名的指針,這可能會導致一些有趣的行爲。你可能會用這種方法學到最多。

  3. 將作業更改爲this->tableId = new string(tableID)。在這裏,您將分配一個新的string,填入參數tableID的值,然後將新字符串的地址分配給實例變量tableID。但是因爲你沒有爲這個類定義析構函數,所以每當你銷燬一個實例到Table時,你都會泄漏這個分配的字符串。

也許上述的一些組合是最好的。

祝你好運。

+0

非常感謝!這是我想出來的。 – Mike1982

+1

附註:使用'this-> tableID = new(std :: nothrow)std :: string(tableID);'因爲你不想(可能)在構造函數中拋出異常。 –

+0

1.我不能改變定義,因爲.h文件是給我們的,如果我們改變它,它不會在線編譯。這是首先想到的,但我得到了一個稍微不同的錯誤。從const轉換爲基本字符串。 3.那個實際上工作。在.h文件中有一個析構函數,所以我只需要在類實現中創建析構函數,而且我很好。謝謝! – Mike1982