Список класса ошибок сегментации - PullRequest
0 голосов
/ 08 апреля 2020

У меня определен следующий список классов. Я пытаюсь отобразить все элементы через оператор переопределения [], который я объявил внутри моего класса

template <typename Data>
class List{
protected:    
   ulong size = 0;

    struct Node{
        Data value;
        struct Node *next;

        //...
    }

    struct Node *top = nullptr;

public :
    //...
    Data& operator [](ulong) const;
    //...
};

//Specific Constructor
template <typename Data>
List<Data>::List(ulong newSize, Data value){
    size = newSize;
    struct Node* tmp;
    struct Node* tmp2 = nullptr;

    for(ulong i = 0; i < newSize; i++){
        tmp2 = new struct Node(value);
        if(top == nullptr){
            top = tmp2;
        }else{
            tmp = top;
            while(tmp->next != nullptr){
                tmp = tmp->next;
            }
            tmp->next = tmp2;
        }
    }
}

 //Copy Constructor
template <typename Data>
List<Data>::List(const List<Data>& ref){
    size = ref.size;
    struct Node* tmp = ref.top;
    struct Node* tmp2 = nullptr;
    struct Node* tmp3;

    while(tmp != nullptr){
        tmp2 = new struct Node();
        tmp2->value = tmp->value;
        if(top == nullptr){
            top = tmp2;
        }else{
            tmp3 = top;
            while(tmp3->next != nullptr){
                tmp3 = tmp3->next;
            }
            tmp3->next = tmp2;
        }
        tmp = tmp->next;
    } 
}

// Move Constructor
template <typename Data>
List<Data>::List(List<Data>&& ref){
    std::swap(size, ref.size);
    std::swap(top, ref.top);
}

template <typename Data>
Data& List<Data>::operator [](ulong i) const{
    if(size == 0)
        throw std::length_error("Lista vuota!");
    else if(i >= size)
        throw std::out_of_range("Lista troppo corta!");

    struct Node* tmp = top;
    for(ulong index = 0; index <= i-1; index++)
        tmp = tmp->next;

    return tmp->value;
}


int main(){
    List<int> l1(10,5); //List of 10 elements all equals to 5

    for(ulong i = 0; i < l1.getSize(); i++)
        std::cout << l1[i] << std::endl;

     return 0;
}

(я поставил самые важные вещи для вопроса) Я не получил никакой ошибки во время заданий (например: l1 [3] = 20;), но в этом случае я получил sigFault, и я не понимаю, почему. Спасибо за помощь.

1 Ответ

0 голосов
/ 09 апреля 2020

Для l oop в operator[] используется неподходящее условие. При сравнении без знака index <= i-1 и значении i, равном 0, условие равно index <= unsigned(-1), которое всегда будет истинным.

Условие можно переписать как index < i:

for (ulong index = 0; index < i; index++)
    tmp = tmp->next;

Или ваш l oop может быть перезаписан на некоторое время l oop:

while (i-- > 0)
    tmp = tmp->next;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...