2015-12-20 6 views
-1

Я работаю над туристическим гидом с использованием C++, и я продолжаю получать этот поток, когда я запускаю код, в классе Attraction, setName функции и в основной функции, и я не понимаю, в чем проблема. Вот файлы .cpp и main.Whats thread thread 1 exc_bad_access (code = exc_i386_gpflt) и как его решить? C++

//.cpp file 
#include <string> 
#include "Attraction.h" 

    string Attraction::getName(){ 
     return name; 
    } 

    int Attraction::getIDType(){ 
     return id; 
    } 
    void Attraction::setName(string name){ 
     this -> name = name;//In this line I receive the thread 
    } 

    void Attraction::setIDType(int typeID){ 
     this -> typeID = typeID; 
    } 
//main.cpp 
    int main() { 
    int x; 
    City Rome(111,"Rome"); 
    City Dubai(222,"Dubai"); 
    City Paris(333, "Paris"); 
    menu(Rome,Dubai,Paris); 
    Sport* Ds = new Sport[x]; 
    Culture* Dc = new Culture[x]; 
    Shopping* Dh = new Shopping[x]; 
//{new Sport,new Sport,new Sport,new Culture,new Culture,new Culture,new Shopping,new Shopping,new Shopping}; 
    Ds[0].setName("Camel and Horse Racing"); 
    Ds[1].setName("Marine Sports"); 
    Ds[2].setName("Football"); 
    Dc[0].setName("Dubai Museum"); 
    Dc[1].setName("Falconry"); 
    Dc[2].setName("Sheikh Saeed Al-Maktoum's House"); 
    Dh[0].setName("Dubai Mall");//And here 
    Dh[1].setName("Mall of Emirates"); 
    Dh[2].setName("Deira City Centre"); 
    Ds[0].setIDType(1); 
    Ds[1].setIDType(1); 
    Ds[2].setIDType(1); 
    Ds[3].setIDType(2); 
    Ds[4].setIDType(2); 
    Ds[5].setIDType(2); 
    Ds[6].setIDType(3); 
    Ds[7].setIDType(3); 
    Ds[8].setIDType(3); 


    Dubai.setAttraction(Ds, x); 

    return 0; 
} 
+1

Вы пишете C++, как будто это то же самое, что и Java. В результате этот код представляет собой утечку памяти. Вы должны «удалить []' массивы, которые вы «новые», и вы должны прочитать «C++ 11 book» Bjarne Stroustroup, чтобы понять управление памятью. –

ответ

1

В коде C++, вы создаете динамический массив размера x, но вы никогда не присвоить значение х, что означает, что по умолчанию имеет значение 0.

Это означает, что следующий линии создают пустые массивы:

Sport* Ds = new Sport[x]; 
Culture* Dc = new Culture[x]; 
Shopping* Dh = new Shopping[x]; 

Так что, когда вы звоните Ds[0].setName(), вы получаете сегментацию ошибку, потому что вы вызываете метод на плохой адрес.

Чтобы устранить эту проблему, убедитесь, что вы указали допустимый размер для каждого массива. Вот пример:

int main() 
{ 

    Sport* Ds = new Sport[9]; 
    Ds[0].setIDType(1); 
    Ds[0].setName("Camel and Horse Racing"); 
    Ds[1].setName("Marine Sports"); 
    Ds[2].setIDType(1); 
    Ds[2].setName("Football"); 
    Ds[3].setIDType(2); 
    Ds[4].setIDType(2); 
    Ds[5].setIDType(2); 
    Ds[6].setIDType(3); 
    Ds[7].setIDType(3); 
    Ds[8].setIDType(3); 

    Culture* Dc = new Culture[3]; 
    Dc[0].setName("Dubai Museum"); 
    Dc[1].setName("Falconry"); 
    Dc[2].setName("Sheikh Saeed Al-Maktoum's House"); 

    Shopping* Dh = new Shopping[3]; 
    Dh[0].setName("Dubai Mall");//And here 
    Dh[1].setName("Mall of Emirates"); 
    Dh[2].setName("Deira City Centre"); 

    delete[] Ds; 
    delete[] Dc 
    delete[] Dh;  

    return 0; 
} 
+0

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

+0

Моя фамилия была неверна. См. Новый ответ. –