2017-02-05 2 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» переменной типа «указатель на строку». Это не работает по той же причине, что и 'int * p = 42;' не будет работать - не имеет смысла. –

+0

Да, я понял, что это так, но я не мог понять, как я собираюсь преобразовать эту строку в указатель. – Mike1982

ответ

1

Несколько вариантов:

  1. Изменить определение tableID в классе Table быть string tableID. В этом случае вы сохраните копию значения в экземпляре.

  2. Изменить назначение this->tableID должно быть this->tableID = &tableID. В этом случае вы назначаете адрес tableID параметру this->tableID. В этом случае вы сохраните указатель на имя таблицы в экземпляре, что может вызвать интересное поведение. Вы, вероятно, узнаете больше всего с помощью этого подхода.

  3. Изменить назначение this->tableId = new string(tableID). Здесь вы назначаете новый string, заполняя его значением параметра tableID, а затем присваивая адрес новой строки экземпляру var tableID. Но поскольку у вас нет деструктора, определенного для этого класса, вы будете утечка этой выделенной строки каждый раз, когда вы уничтожаете экземпляр до Table.

Возможно, какая-то комбинация из вышеперечисленного была бы лучшей.

Удачи.

+0

Большое вам спасибо! Вот что я придумал. – Mike1982

+1

Примечание: используйте 'this-> tableID = new (std :: nothrow) std :: string (tableID);' вы не хотите (возможно) исключать исключение в конструкторе. –

+0

1. Я не могу изменить определение, потому что файл .h был предоставлен нам, и он не будет компилироваться в Интернете, если мы его изменим. 2. Сначала это было задумано, но я получил немного другую ошибку. преобразование из const в базовую строку. 3. Это действительно сработало. В файле.h есть деструктор, поэтому мне нужно просто создать деструктор в реализации класса, и я хорош. Спасибо! – Mike1982

Смежные вопросы