Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вопрос к гуру С++  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4006
Попался мне такой код
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }

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

Вопрос чисто академический.
4 сен 19, 14:45    [21963497]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
a.guest
Member

Откуда:
Сообщений: 54
Ты ничего не перепутал?
4 сен 19, 14:57    [21963516]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
ИМХО ерунда какая-то написана.
Может попался
(*it).DeviceCreated();

вместо
it->DeviceCreated();


В чем смысл - не знаю. Насколько понимаю результат будет одинаковый, разница только в синтаксисе.
4 сен 19, 14:58    [21963520]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
SQL2008
Попался мне такой код
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }

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

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

Итератор служит для итерирования и получения текущего значения, на который он указывает
. Для второго служат перегруженные операторы
4 сен 19, 15:03    [21963528]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

SQL2008
В чем смысл обращения по ссылке?

Очевидно в том, что в контейнере лежат указатели, а не сами объекты.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 15:18    [21963547]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Более того: в контейнере лежат указатели на указатели.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 15:20    [21963551]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
Dimitry Sibiryakov
Более того: в контейнере лежат указатели на указатели.

ИМХО ТС напутал 21963520, если it указатель на указатель, то это не скомпилируется
it.DeviceCreated();
4 сен 19, 15:25    [21963563]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
Dima T
Dimitry Sibiryakov
Более того: в контейнере лежат указатели на указатели.

ИМХО ТС напутал 21963520, если it указатель на указатель, то это не скомпилируется
it.DeviceCreated();
+1
Стрелка ставится при указателе. То есть переписать код придется. А не что хочу то и ставлю.
4 сен 19, 15:30    [21963567]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
SQL2008
В чем смысл обращения по ссылке?
точка если там структура.
Стрелка если там указатель на структуру.
Всё.
4 сен 19, 15:32    [21963571]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
PetroNotC Sharp
SQL2008
В чем смысл обращения по ссылке?
точка если там структура.
Стрелка если там указатель на структуру.
Всё.

Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.
4 сен 19, 15:37    [21963580]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Dima T
Не, вопрос о том что вместо стрелки *it->* можно написать *(*it).* TCу непонятно зачем так
пишут.

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

Posted via ActualForum NNTP Server 1.5

4 сен 19, 15:40    [21963585]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
Dimitry Sibiryakov
Dima T
Не, вопрос о том что вместо стрелки *it->* можно написать *(*it).* TCу непонятно зачем так
пишут.

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

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

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

В чем смысл обращения по ссылке?

Перепутал стрелку и точку, т.е. it это обычный указатель, а не указатель на указатель.
Иначе вопрос превращается в тупой: "почему нельзя менять рабочий код на нерабочий?"
4 сен 19, 15:47    [21963597]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Dima T
Иначе вопрос превращается в тупой: "почему нельзя менять рабочий код на нерабочий?"

Ну так по-моему всё правильно и вопрос именно такой.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 15:50    [21963602]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
Dima T
PetroNotC Sharp
пропущено...
точка если там структура.
Стрелка если там указатель на структуру.
Всё.

Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.
вангую что это стиль С а не плюсов.
4 сен 19, 15:51    [21963605]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
Dima T,
У него пример компилируется?
4 сен 19, 15:52    [21963607]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
Вот пример нагуглил обучающий
http://cppstudio.com/post/9535/
  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;
  }

ИМХО наверно преподаватели пытались показать равнозначность обоих вариантов, а нерадивые ученики тупо скопипастили в реальный код то, что больше понравилось.
4 сен 19, 16:05    [21963624]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
Dima T,
))))
Невозможно ничего скрыть сегодня в IT
))
4 сен 19, 16:08    [21963629]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Barlone
Member

Откуда:
Сообщений: 1348
Dima T
Вот пример нагуглил обучающий
http://cppstudio.com/post/9535/
  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 был указателем, то оно точно было бы эквивалентно. А тут надо еще убедиться, что операторы '->' и '*' перегружены так, что оно эквивалентно.
4 сен 19, 19:52    [21963878]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
teo609
Member

Откуда: Рязань
Сообщений: 119
SQL2008
Попался мне такой код
    for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++)
    {
        (*it)->DeviceCreated();
    }

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

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


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

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

Сейчас нет возможности привести детали, но точно что переопределение оператора точки много где встречается для обращения к полям класса-указателя, а оператор стрелка в том же классе-указателе дает доступ к указываемому объекту. Итератор в этом смысле лишь вид указателя.
4 сен 19, 23:41    [21964068]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

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

5 сен 19, 00:19    [21964087]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4006
PetroNotC Sharp
Dima T,
У него пример компилируется?

Компилируется.
9 сен 19, 17:14    [21967092]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
SQL2008
Member

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

Сейчас нет возможности привести детали, но точно что переопределение оператора точки много где встречается для обращения к полям класса-указателя, а оператор стрелка в том же классе-указателе дает доступ к указываемому объекту. Итератор в этом смысле лишь вид указателя.

Да.
Скорее всего идея именно в перегрузке операторов.
Реальной или планируемой в будущем при расширении платформы.
Всем спасибо за дискуссию.
9 сен 19, 17:23    [21967102]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
Dima T
Member

Откуда:
Сообщений: 14114
SQL2008
Скорее всего идея именно в перегрузке операторов.

21964087
9 сен 19, 20:31    [21967258]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
NekZ
Member

Откуда: Stuttgart, Baden-Württemberg.
Сообщений: 3568
Уоу... Всё совсем плохо, если гуру должны отвечать на такие детские вопросы.
9 сен 19, 21:05    [21967279]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к гуру С++  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3061
PetroNotC Sharp
Dima T
пропущено...

Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.
вангую что это стиль С а не плюсов.
А в чём разница между работой с указателями в Си и работой с указателями в С++? :)
16 сен 19, 14:33    [21971660]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить