2015-05-19 2 views
1

Когда я запускаю свою программу он падает со следующей ошибкой:соиЬ Образовавшееся Terminate вызывается после метания экземпляра «станд :: length_error»

terminate called after throwing an instance of 'std::length_error' what(): basic_string::_S_create Aborted (core dumped)

я получаю, что с помощью следующего кода:

#include <iostream> 
#include <string> 
using namespace std; 

class Cargo 
{ 
    string nm; 
public: 
    Cargo(const string& name): nm(name) 
    { 

    } 
    Cargo& operator=(const Cargo&) 
    { 
     cout<<"inside Cargo::operator=()"<<endl; 
     return *this; 
    } 

    friend ostream& operator<<(ostream& os, const Cargo& ca) 
    { 
     return os<<"Cargo name: "<<ca.nm; 
    } 
}; 

class Truck 
{ 
    Cargo b; 
    string name; 
public: 
    Truck(const string& nm):b("Cargo" + name) 
    { 
     name = nm; 
    } 

    void print() 
    { 
     cout << "name: " << name << endl; 
     cout << b << endl; 
    } 
}; 

int main() 
{ 
    Truck a("Truck a"), b("Truck b"); 
    a = b; 
    a.print(); 
    b.print(); 
}///~: 
+0

В этот момент 'b (« Cargo »+ name)' в конструкторе 'Truck',' name' не инициализируется. –

+0

@RichardCritten, tks, я получил его – husker

ответ

1

в вашем Truck конструктору:

Truck(const string& nm):b("Cargo" + name) 
{ 
    name = nm; 
} 

Вы отправляете в качестве параметра b атрибут name вашего класса Truck, который не инициализирован. Я предполагаю, что вы хотите передать свой параметр nm вместо:

Truck(const string& nm):b("Cargo" + nm) 
{ 
    name = nm; 
} 
1

В грузовике у вас есть b("Cargo" + name). name еще не имеет значения, поскольку вы не ввели конструктор. Если вы измените его на b("Cargo" + nm), он исправит временную эхорр. См this живого примера

Вы также должны инициализировать name в списке intializer как:

Truck(const string& nm):b("Cargo" + nm), name(nm) {} 

Это нормально иметь пустой конструктор, и я предпочитаю, чтобы сделать это, как это показывает все конструктор делает инициализацию переменные-члены и ничего больше.

+0

Объяснение сообщения об ошибке немного больше: переменные-члены создаются в порядке объявления; поэтому '' Cargo '+ name' фактически обрабатывается до того, как 'name' имеет свой конструктор, вызывающий неопределенное поведение. –

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

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