powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос к гуру С++
25 сообщений из 37, страница 1 из 2
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #39857229
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты ничего не перепутал?
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39857233
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО ерунда какая-то написана.
Может попался
Код: plaintext
1.
(*it).DeviceCreated();


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



В чем смысл - не знаю. Насколько понимаю результат будет одинаковый, разница только в синтаксисе.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #39857254
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008В чем смысл обращения по ссылке?

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

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

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

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

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

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

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

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


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

Ну так по-моему всё правильно и вопрос именно такой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39857287
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPetroNotC Sharpпропущено...
точка если там структура.
Стрелка если там указатель на структуру.
Всё.
Не, вопрос о том что вместо стрелки it-> можно написать (*it). TCу непонятно зачем так пишут. Если честно, мне тоже интересно, как-то натыкался на такой синтаксис.вангую что это стиль С а не плюсов.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39857289
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
У него пример компилируется?
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #39857308
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
))))
Невозможно ничего скрыть сегодня в IT
))
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #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
Вопрос к гуру С++
    #39859459
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpDima T,
У него пример компилируется?
Компилируется.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39859466
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609 И в первом случае it (в (*it)->) имеет тип vector<Controller*>::iterator, далее (*it) это Controller*, и поэтому доступ к методу DeviceCreated() есть.
Во втором случае будет попытка обращения vector<Controller*>::iterator.DeviceCreated(), и ошибка.

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

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


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