Не могу вызвать перегрузку

135
26 декабря 2020, 16:20

Продолжаю пробовать перегружать операторы, и вновь не могу вызвать перегрузку. Например, есть класс List:

class List
{
    Node *first;
    Node *end;
    int *count;
public:
    List()
    {
        first = NULL;
        end = NULL;
        count = new int(0);
    }
    ~List()
    {
        delete count;
    }
    void Add(Branch *ptr)
    {
        if (first == NULL)
        {
            first = end = new Node();
            first->prev = NULL;
            first->item = ptr;
            first->next = NULL;
        }
        else
        {
            end->next = new Node();
            end = end->next;
            end->item = ptr;
            end->next = NULL;
        }
        *count = *count + 1;
    }
    Branch* operator[](int i)
    {
        if (!(i < *count))
        {
            return NULL;
        }
        Node *temp = first;
        int j = 0;
        while (j < i)
        {
            temp = temp->next;
            j++;
        }
        return temp->item;
    }
    void Set(int i, Branch* ptr)
    {
        if (!(i < *count))
        {
            return;
        }
        Node *temp = first;
        int j = 0;
        while (j < i)
        {
            temp = temp->next;
            j++;
        }
        temp->item = ptr;
    }
    void Delete(int i)
    {
        if (!(i < *count))
        {
            return;
        }
        Node *temp = first;
        int j = 0;
        while (j < i)
        {
            temp = temp->next;
            j++;
        }
        if (temp == first)
        {
            first = first->next;
            first->prev = NULL;
            delete temp;
        }
        else if (temp == end)
        {
            end = end->prev;
            end->next = NULL;
            delete temp;
        }
        else
        {
            temp->next->prev = temp->prev;
            temp->prev->next = temp->next;
            delete temp;
        }
        count--;
    }
    int Count()
    {
        return *count;
    }
};

В нём перегружен оператор =;

Если я вызываю из Main()

int main()
{
    List *wow = new List;
    cout << (*wow)[0]->node_to; //выведет 1;
}

Идём дальше, объявляем класс Graph

class Graph
{
public:
    List *branhes;
    Graph()
    {
branches = new List();
}
};

В main объявляем:

int main()
{
Graph *graph = new Graph();
graph->branches[0]; //ссылается на сам список, а не на перегрузку
}

Вот в чём вопрос, как вызывать перегрузку при таком объявлении из объекта? Извиняюсь, если тупой вопрос, поиском воспользовался, может искать не умею, но ничего не нашёл.

Answer 1

(*graph->branches)[i] (или graph->branches[0][i]).

Кроме того, во-первых: Зачем вы используете указатели и new/delete там, где они не нужны? Раз: int *count; count = new int(0);. Два: List *branhes; Graph *graph = new Graph(); Можно ведь просто сделать int count; и List branches;.

Во вторых: Ваш ~List() вызывает утечку памяти. Кто будет удалять содержимое списка?

В третьих: Поскольку List нарушает the rule of three, он совершенно не подходит для использования в настоящих программах. Он ломается даже от List a, b; a = b;.

Когда будете приводить класс в соответствие с the rule of three, вам может пригодиться это: What is the copy-and-swap idiom?

READ ALSO
Линия которую я не понимаю

Линия которую я не понимаю

Вызываю функцию которая рисует круги и почему то дорисовывает одну точку из центра и не как избавиться от этого "явления" не могу

136
Не учитывать клик по элементам родителя

Не учитывать клик по элементам родителя

Нужно получить клик только по контейнеруЕсли я произвожу клик по элементам внутри контейнера, то они тоже засчитываются

99
вложенные категории django+jquaery

вложенные категории django+jquaery

Подскажите пожалуйста как реализовать подобную структуру на django+jquery? modelspy

123
Как это сделать на bootstrap?

Как это сделать на bootstrap?

И как эта штука называется когда свайпается вправо каждые n секунд и можно нажимать на срелочки

116