Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос к гуру С++ / 25 сообщений из 37, страница 1 из 2
04.09.2019, 14:45
    #39857215
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Попался мне такой код
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }


В чем смысл обращения по ссылке?
Почему нельзя так:
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
	it.DeviceCreated();
    }


Вопрос чисто академический.
...
Рейтинг: 0 / 0
04.09.2019, 14:57
    #39857229
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Ты ничего не перепутал?
...
Рейтинг: 0 / 0
04.09.2019, 14:58
    #39857233
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
ИМХО ерунда какая-то написана.
Может попался
Код: plaintext
1.
(*it).DeviceCreated();


вместо
Код: plaintext
1.
it->DeviceCreated();



В чем смысл - не знаю. Насколько понимаю результат будет одинаковый, разница только в синтаксисе.
...
Рейтинг: 0 / 0
04.09.2019, 15:03
    #39857240
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
SQL2008Попался мне такой код
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }


В чем смысл обращения по ссылке?
Почему нельзя так:
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
	it.DeviceCreated();
    }


Вопрос чисто академический.
Итератор служит для итерирования и получения текущего значения, на который он указывает
. Для второго служат перегруженные операторы
...
Рейтинг: 0 / 0
04.09.2019, 15:18
    #39857254
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
SQL2008В чем смысл обращения по ссылке?

Очевидно в том, что в контейнере лежат указатели, а не сами объекты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.09.2019, 15:20
    #39857258
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Более того: в контейнере лежат указатели на указатели.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.09.2019, 15:25
    #39857265
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dimitry SibiryakovБолее того: в контейнере лежат указатели на указатели.

ИМХО ТС напутал 21963520 , если it указатель на указатель, то это не скомпилируется
Код: plaintext
1.
it.DeviceCreated();
...
Рейтинг: 0 / 0
04.09.2019, 15:30
    #39857267
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima TDimitry SibiryakovБолее того: в контейнере лежат указатели на указатели.

ИМХО ТС напутал 21963520 , если it указатель на указатель, то это не скомпилируется
Код: plaintext
1.
it.DeviceCreated();

+1
Стрелка ставится при указателе. То есть переписать код придется. А не что хочу то и ставлю.
...
Рейтинг: 0 / 0
04.09.2019, 15:32
    #39857268
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
SQL2008В чем смысл обращения по ссылке?точка если там структура.
Стрелка если там указатель на структуру.
Всё.
...
Рейтинг: 0 / 0
04.09.2019, 15:37
    #39857272
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
PetroNotC SharpSQL2008В чем смысл обращения по ссылке?точка если там структура.
Стрелка если там указатель на структуру.
Всё.
Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.
...
Рейтинг: 0 / 0
04.09.2019, 15:40
    #39857275
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima TНе, вопрос о том что вместо стрелки *it->* можно написать *(*it).* TCу непонятно зачем так
пишут.

А ты попробуй написать "it->->DeviceCreated()" и послушай мнение компилятора по этому поводу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.09.2019, 15:47
    #39857281
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dimitry SibiryakovDima TНе, вопрос о том что вместо стрелки *it->* можно написать *(*it).* TCу непонятно зачем так
пишут.

А ты попробуй написать "it->->DeviceCreated()" и послушай мнение компилятора по этому поводу.

Однако ловко ты мой пост пропатчил :)

Ты внимательно попробуй прочитай первый пост, ИМХО ТС явно напутал:
SQL2008
Код: plaintext
1.
        (*it)->DeviceCreated();


В чем смысл обращения по ссылке?
Перепутал стрелку и точку, т.е. it это обычный указатель, а не указатель на указатель.
Иначе вопрос превращается в тупой: "почему нельзя менять рабочий код на нерабочий?"
...
Рейтинг: 0 / 0
04.09.2019, 15:50
    #39857285
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima TИначе вопрос превращается в тупой: "почему нельзя менять рабочий код на нерабочий?"

Ну так по-моему всё правильно и вопрос именно такой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.09.2019, 15:51
    #39857287
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima TPetroNotC Sharpпропущено...
точка если там структура.
Стрелка если там указатель на структуру.
Всё.
Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.вангую что это стиль С а не плюсов.
...
Рейтинг: 0 / 0
04.09.2019, 15:52
    #39857289
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima T,
У него пример компилируется?
...
Рейтинг: 0 / 0
04.09.2019, 16:05
    #39857303
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Вот пример нагуглил обучающий
http://cppstudio.com/post/9535/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  for (auto it = myFirstMap.begin(); it != myFirstMap.end(); ++it)
  {
      cout << it->first << " : " << it->second << endl;
  }
...
  for (auto it = mySecondMap.begin(); it != mySecondMap.end(); ++it)
  {
      cout << (*it).first << " : " << (*it).second << endl;
  }


ИМХО наверно преподаватели пытались показать равнозначность обоих вариантов, а нерадивые ученики тупо скопипастили в реальный код то, что больше понравилось.
...
Рейтинг: 0 / 0
04.09.2019, 16:08
    #39857308
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima T,
))))
Невозможно ничего скрыть сегодня в IT
))
...
Рейтинг: 0 / 0
04.09.2019, 19:52
    #39857482
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Dima TВот пример нагуглил обучающий
http://cppstudio.com/post/9535/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  for (auto it = myFirstMap.begin(); it != myFirstMap.end(); ++it)
  {
      cout << it->first << " : " << it->second << endl;
  }
...
  for (auto it = mySecondMap.begin(); it != mySecondMap.end(); ++it)
  {
      cout << (*it).first << " : " << (*it).second << endl;
  }


ИМХО наверно преподаватели пытались показать равнозначность обоих вариантов, а нерадивые ученики тупо скопипастили в реальный код то, что больше понравилось.Если бы it был указателем, то оно точно было бы эквивалентно. А тут надо еще убедиться, что операторы '->' и '*' перегружены так, что оно эквивалентно.
...
Рейтинг: 0 / 0
04.09.2019, 23:41
    #39857601
teo609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
SQL2008Попался мне такой код
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }


В чем смысл обращения по ссылке?
Почему нельзя так:
Код: plaintext
1.
2.
3.
4.
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
	it.DeviceCreated();
    }


Вопрос чисто академический.

Итератор может быть классом, переопределяющим разные операторы. В конструкции (*it)-> внутри скобок доступ к объекту по итератору, и если от этого объекта делается доступ по указателю, то это, видимо, указатель.
Во втором случае it. это может быть доступ к полю класса интератора, и там тупо нет такого метода.
То есть где-то в коде наверное есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class Controller
{
    bool DeviceCreated();
};
class MyClass
{
    vector<Controller*> m_vControllers;
};


И в первом случае it (в (*it)->) имеет тип vector<Controller*>::iterator, далее (*it) это Controller*, и поэтому доступ к методу DeviceCreated() есть.
Во втором случае будет попытка обращения vector<Controller*>::iterator.DeviceCreated(), и ошибка.

Сейчас нет возможности привести детали, но точно что переопределение оператора точки много где встречается для обращения к полям класса-указателя, а оператор стрелка в том же классе-указателе дает доступ к указываемому объекту. Итератор в этом смысле лишь вид указателя.
...
Рейтинг: 0 / 0
05.09.2019, 00:19
    #39857619
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
teo609переопределение оператора точки много где встречается

Ух ты... а мужики-то стандарт считает, что "The operators :: (scope resolution), .
(member access), .* (member access through pointer to member), and ?: (ternary
conditional) cannot be overloaded".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.09.2019, 17:14
    #39859459
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
PetroNotC SharpDima T,
У него пример компилируется?
Компилируется.
...
Рейтинг: 0 / 0
09.09.2019, 17:23
    #39859466
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
teo609 И в первом случае it (в (*it)->) имеет тип vector<Controller*>::iterator, далее (*it) это Controller*, и поэтому доступ к методу DeviceCreated() есть.
Во втором случае будет попытка обращения vector<Controller*>::iterator.DeviceCreated(), и ошибка.

Сейчас нет возможности привести детали, но точно что переопределение оператора точки много где встречается для обращения к полям класса-указателя, а оператор стрелка в том же классе-указателе дает доступ к указываемому объекту. Итератор в этом смысле лишь вид указателя.
Да.
Скорее всего идея именно в перегрузке операторов.
Реальной или планируемой в будущем при расширении платформы.
Всем спасибо за дискуссию.
...
Рейтинг: 0 / 0
09.09.2019, 20:31
    #39859571
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
SQL2008Скорее всего идея именно в перегрузке операторов.
21964087
...
Рейтинг: 0 / 0
09.09.2019, 21:05
    #39859582
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
Уоу... Всё совсем плохо, если гуру должны отвечать на такие детские вопросы.
...
Рейтинг: 0 / 0
16.09.2019, 14:33
    #39862324
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к гуру С++
PetroNotC SharpDima Tпропущено...

Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.вангую что это стиль С а не плюсов.А в чём разница между работой с указателями в Си и работой с указателями в С++? :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос к гуру С++ / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]