1834 / 1176 / 501
Регистрация: 14.10.2018
Сообщений: 3,179
1

Параметр this в конструкторе, методе

27.11.2019, 16:18. Показов 4144. Ответов 6

Рассмотрим на примере узла (Node) кольцевого двусвязного списка. Значения первого узла (Next, Prev) будут указывать на текущий класс.
C#
1
2
3
4
5
class Node
{
    Node Next;
    Node Prev;
}
Конструктор 1. (нужный конструктор для this() имеется) Компилятор ругается на 2 аргумента this
C#
1
    public Node() : this(this, this) { }
Конструктор 2. Компилятор ругается на 2 значения по умолчанию this. Тоже самое с любым методом
C#
1
    public Node(Node next = this, Node prev = this) { }
Конструктор 3. Все работает
C#
1
2
3
4
5
    public Node()
    {
        Next = this;
        Prev = this;
    }
Вопрос: где та тонкая грань, при которой можно использовать this?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2019, 16:18
Ответы с готовыми решениями:

Работа аргументов в методе и конструкторе
Добрый день!Буду благодарен, если кто-нибудь пошагово объяснит, как аргументы в методе передаются в...

Параметр в конструкторе копирования
Есть класс class CMatrix{ valarray<valarray<double> > matrix; public: CMatrix(const...

this - параметр метода, который вызывается в конструкторе
Здарствуйте. Имеется следующий код: import javax.swing.*; import java.awt.*; class...

Можно ли в конструкторе копирования поменять один параметр?
Здравствуйте. Мне нужно при создании объекта через конструктор копирования поменять один параметр в...

6
Эксперт .NET
6229 / 3864 / 1558
Регистрация: 09.05.2015
Сообщений: 9,133
27.11.2019, 16:33 2
Цитата Сообщение от Enifan Посмотреть сообщение
Компилятор ругается на 2 значения по умолчанию this.
Значение параметра по умолчанию должно быть константой, а this это не константа, поэтому его нельзя использовать как значение по умолчанию.
1
Эксперт .NET
16371 / 12332 / 3237
Регистрация: 17.09.2011
Сообщений: 20,473
27.11.2019, 16:51 3
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Цитата Сообщение от Enifan Посмотреть сообщение
где та тонкая грань, при которой можно использовать this?
Не тонкая, а вполне четко определенная.
Ссылку this можно использовать ровно в трех местах:
  1. В теле конструктора экземпляра
  2. В теле метода экземпляра
  3. В теле акцессора свойства экземпляра

Первый вариант не проходит, т.к. ссылка используется вне тела конструктора, второй вариант не подходит из-за того, что this — не константное выражение, а третий вариант ОК, т.к. попадает под первый пункт.
3
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
27.11.2019, 17:36 4
kolorotur,
4. В индексаторах
0
Эксперт .NET
16371 / 12332 / 3237
Регистрация: 17.09.2011
Сообщений: 20,473
27.11.2019, 17:49 5
Цитата Сообщение от Ourn Посмотреть сообщение
4. В индексаторах
Если вы про объявление, то это не ссылка, а если про реализацию, то это акцессоры, т.е. пункт 3.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
27.11.2019, 18:15 6
Лучший ответ Сообщение было отмечено kolorotur как решение

Решение

Цитата Сообщение от kolorotur Посмотреть сообщение
Если вы про объявление, то это не ссылка, а если про реализацию, то это акцессоры, т.е. пункт 3.
Я о том, что свойство все же не тождественно равно индексатору. Наверно точнее всего будет
3. В теле акцессора свойства или индексатора экземпляра

Согласны?
1
Эксперт .NET
16371 / 12332 / 3237
Регистрация: 17.09.2011
Сообщений: 20,473
27.11.2019, 20:52 7
Цитата Сообщение от Ourn Посмотреть сообщение
что свойство все же не тождественно равно индексатору.
У индексатора есть акцессоры: get и set.
За их пределами в индексаторе использование this невозможно.

Цитата Сообщение от Ourn Посмотреть сообщение
3. В теле акцессора свойства или индексатора экземпляра
Согласны?
Да тут наше с вами согласие или несогласие никакой роли не играет — ограничения определены спецификацией языка:
A this_access is permitted only in the block of an instance constructor, an instance method, or an instance accessor.
Добавлено через 3 минуты
Ourn, хотя, я понял что вы имели в виду: у меня в третьем пункте конкретно прописано "свойства".
Конечно, индексатор тоже туда входит. Надо было просто написать "в акцессорах", без "свойства".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2019, 20:52
Помогаю со студенческими работами здесь

MySqlDataAdapter: что за параметр в fill методе
Есть код. MySqlCommand com = null; com = new MySqlCommand("my_procedure", con); ...

Const параметр в методе и приведение типов
Метод с константным параметром ссылкой void MyClass::MyMethod(const QString &s) { QDebug<<s; }...

SetTimer в конструкторе класса, функция-член которого параметр
Приветствую. Как передать функцию TimerComplete() как 4-й параметр функции SetTimer? class...

Параметр const T & val = T() в конструкторе шаблонного класса
Добрый день! Начал разбираться с шаблонами и наткнулся на такой пример: template < typename T...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru