powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос к гуру С++
37 сообщений из 37, показаны все 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
Вопрос к гуру С++
    #39862415
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Дык ванговал же)))
Неужели не угадал?
Ну даай ещё раз.
В плюсах работают (обращение к объекту) со стрелками и точками.
А в Си со звездочками.
Или его величество СИНТАКСИС.
У тебя же выше и есть 2 варианта синтаксиса.
А ты спрашиваешь в чем разница.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862420
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devА в чём разница между работой с указателями в Си и работой с указателями в С++? :)в Си сложно перегрузить оператор -> ))
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862850
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharprdb_dev,
Дык ванговал же)))
Неужели не угадал?
Ну даай ещё раз.
В плюсах работают (обращение к объекту) со стрелками и точками.Нет такого в "плюсах"! :)
В "плюсах" доступ к членам экземпляра структуры или класса ничем не отличается от доступа к членам экземпляра структуры в Си и осуществляется оператором '.' (точка), а доступ к членам структуры или класса через указатель на экземпляр структуры или класса осуществляется оператором '->'. Операторы взятия адреса '&<instance>' и разыменования указателя '*<ptrInstance>' в плюсах точно такие же, как в Си, а всё потому, что C++ наследует синтаксис Си со своими дополнениями и некоторыми оговорками.

PetroNotC SharpА в Си со звездочками.
Или его величество СИНТАКСИС.
У тебя же выше и есть 2 варианта синтаксиса.
А ты спрашиваешь в чем разница.Иди учить матчасть!
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862858
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychrdb_devА в чём разница между работой с указателями в Си и работой с указателями в С++? :)в Си сложно перегрузить оператор -> ))Это, наверное, потому, что в Си нет понятия методов структуры, а следовательно, нет и перегрузки этих методов. :)
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862877
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devC++ наследует синтаксис Си со своими дополнениями и некоторыми оговорками."открыл америку".
Разве твой ответ противоречит моему?
авторВ плюсах работают (обращение к объекту) со стрелками и точками.
Вверху 2 варианта кода. Покажи какой пишешь ты из двух.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862878
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorychпропущено...
в Си сложно перегрузить оператор -> ))Это, наверное, потому, что в Си нет понятия методов структуры, а следовательно, нет и перегрузки этих методов. :)стакан полуналитый или полупустой?
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862923
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpВверху 2 варианта кода. Покажи какой пишешь ты из двух.Мне без разницы! Но если используется доступ к множеству членов на большом уровне инкапсуляции, то для улучшения восприятия исходного кода предпочитаю "урезать", разыменовывая указатель в именованную ссылку, после чего использую точку.
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862927
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharprdb_devпропущено...
Это, наверное, потому, что в Си нет понятия методов структуры, а следовательно, нет и перегрузки этих методов. :)стакан полуналитый или полупустой?Относительно используемого объема пространства правильнее писать "заполнен на 50% объема" или "используется 50% объема стакана". :)
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39862932
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devМне без разницы!ну вот. А я когда не было С++ писал без стрелок. Сейчас со стрелками.

rdb_devОтносительно используемого объема пространства правильнее писать "заполнен на 50% объема" или "используется 50% объема стакана". :)
))))
Согласен. Всё относительно. Разошлись.))
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39863290
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorychв Си сложно перегрузить оператор -> ))Это, наверное, потому, что в Си нет понятия методов структуры, а следовательно, нет и перегрузки этих методов. :)ну, эмулировать то можно, указатель на функцию запихай в структуру, вот тебе и метод) а вот перегрузки в Си нет, поэтому для Си код ( *it )->DeviceCreated(); и it.DeviceCreated(); эквивалентен, а в плюсах может быть и нет
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39863314
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychrdb_devпропущено...
Это, наверное, потому, что в Си нет понятия методов структуры, а следовательно, нет и перегрузки этих методов. :)ну, эмулировать то можно, указатель на функцию запихай в структуру, вот тебе и метод) а вот перегрузки в Си нет, поэтому для Си код ( *it )->DeviceCreated(); и it.DeviceCreated(); эквивалентен, а в плюсах может быть и нетОткуда функция DeviceCreated() будет знать - для какого экземпляра объекта она вызвана и зачем пихать в структуру указатель на эмуляцию "невиртуального метода", увеличивая размер структуры? Даже C++ так не делает. Просто определяем "bool DeviceCreated(struct MyStruct*)" и вызываем DeviceCreated(it), а если делать эмуляцию виртуальных методов, то в результате придётся писать вызов в виде:
Код: plaintext
it.vtbl->DeviceCreated(it)
...
Рейтинг: 0 / 0
Вопрос к гуру С++
    #39863692
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, я понимаю, что есть неистребимое желание поспорить ради спора)) напоминаю, что мы ничего не знаем ни о методе DeviceCreated, ни о структуре. Такой дизайн
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос к гуру С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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