Трудности с пониманием кода

179
08 мая 2018, 00:23

Имеется некоторый исходный код, который был написан преподом, и в нем необходимо разобраться. Пытаясь сделать это, наткнулся на некоторые трудности. Собственно, вопросы для решения этих трудностей:

  1. Важна ли последовательность при написании реализации методов класса?
  2. Имеется такая реализация конструктора класса.

    cl_base::cl_base(cl_base * p_parent) 
    {
        set_object_name("cl_base"); 
        if (p_parent) {             
            this->p_parent = p_parent; 
            p_parent->add_child(this);
        }
        else {
            this->p_parent = 0;
        }
    }
    

Также имеется реализация метода add_child:

void cl_base::add_child(cl_base * p_child)
{
    children.push_back(p_child); 
}

Что выполняет строка p_parent -> add_child(this)? Что именно передается при использовании this в качестве формального параметра для метода add_child, и какой следует результат из передачи в метод именно this?

  1. Имеется следующий код:
    vector < cl_base * > children; vector < cl_base * > ::iterator it_child; Для чего в качестве типа вектора используется указатель на cl_base, и почему этот самый указатель никак не назван? Для выполнения каких задач нам необходимо использовать тип данных, который представлен, как указатель на другой тип данных?

    1. Если в параметр функции передать указатель, значит ли это, что при непосредственном вызове функции этому указателю(тот, что мы передали) будет присвоен адрес значения, которое мы ввели в качестве фактического параметра?

Очень буду рад развернутым ответам с примерами. Заранее благодарю!

Answer 1

Собственно:

1) Нет, главное чтобы они были в определении класса, но порядок не важен.

2) this - это указатель на используемый объект класса. Т.е, когда у вас есть объект node и вы от его имени вызываете какой-то метод, который должен возвратить указатель на этот самый объект, то он возвратит именно this. Также если вам нужен не указатель, а сам объект (или ссылка на его), то можно просто его разыменовать *this. В вашем же коде строка:

    p_parent->add_child(this);

обращается к переданному объекту (точнее указателю на него), и применяет к нему метод add_child(). Собственно, как я понимаю, это у вас список, так что можно сказать, что этот код устанавливает связи между двумя нодами: одна становится родителем, другая потомком.

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

4) Тут я вообще не понял о чем вы. Когда у вас в аргументе функции указатель, то это означает, что вы должны передавать туда адрес соответствующего объекта.

READ ALSO
Наследование. Вектор на плоскости

Наследование. Вектор на плоскости

Задание: Описать производный класс, дополнительно содержащий методы: умножения вектора на число, сложения двух векторов, вычитания двух...

244
Замена вектора декой

Замена вектора декой

Помогите понять в чем проблема:

223
Каретка в QLineEdit

Каретка в QLineEdit

Как сделать так, чтобы в QLineEdit автоматически (без нажатия клавиш влево-вправо) отображалась каретка?

230
Почему то не работает деление в программе. Язык C++

Почему то не работает деление в программе. Язык C++

Деление целого на целое в С++ дает целое число, замените 1 на 10

183