![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mrgloom |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
требует чтобы Calc было static, но Calc внутри зависит от m_some_const и соответсвенно её тоже надо делать тогда статик, но тогда
как разрешить проблему и как правильно? Это сообщение отредактировал(а) mrgloom - 18.2.2013, 17:24 |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Он требует статик потому что в функцию Execute не передан указатель на CMyDlg . С ним можно было написать MyDlg->Calc(var); не делая Calc статической
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: нет Всего: 9 |
Вы вызываете не статическую функцию класса не создав объект, поэтому компилятор и ругается. Соответственно, после того как функция объявлена как статическая, она не может использовать не статические поля.
|
|||
|
||||
korian |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
похоже на попытку писать как на java. В c++, внутренний класс не содержит в себе автоматом ссылку на внешний класс. Т.е. в c++ они все static как бы. При этом к приватным полям доступа тоже кажись не дадут. (Не помню). Можно починить так как ниже, но это наверно не лучший вариант.
Добавлено через 1 минуту и 52 секунды
не константные static переменные должны быть определены в cpp-файле (в добавок к определению в h-файле). static int CMyDlg::m_some_const = 0; |
||||
|
|||||
mrgloom |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
эти ответы помогли, только надо
А почему плохое решение?
|
||||||||
|
|||||||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
Если надо писать "friend class ...", то я автоматом считаю решение не хорошим. Но я ничего не могу сказать по поводу того, почему оно плохое. Т.е. надо знать пороблему и понять, можно ли сделать по другому (обычно можно). да, я запятую пропустил, после m_dlg(dlg) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Грубо говоря, если А предназначено для B, то А является другом для B, что и реализует модификатор friend. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну я в итог сделал const функцию и переменную. вроде бы это особых ограничений не накладывает.
я говорил про строчку
т.е. когда так в функцию передается понятно аля func(CMyDlg &m_dlg), а что значит когда так объявляется переменная? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Это значит, что функция ожидает в качестве параметра ссылку на переменную. Ссылка это некоторое подобие указателя с той лишь разницей, что ссылка всегда указывает на реально существующую переменную. Ссылка это некоторый псевдоним переменной, поэтому при обращении к полям или функциям объекта синтаксис как у переменной. Ссылка инициализируется в момент создания и дальше не уже не может менять свою привязку к переменной. К примеру, переменная это ни что иное как адрес некоторой области памяти. Вот если 2е переменные определяют одну и ту же область памяти, то одна из переменных является ссылкой. Не путать с указателем. Указатель хранит адрес на этапе исполнения, а переменная (ссылка) хранит данные по некоторому адресу в памяти.
Это сообщение отредактировал(а) Alexeis - 20.2.2013, 12:29 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
korian |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
По моему опыту, в 99.99% так оно и есть. Т.е. если friend используется в коммерческом проекте (не библиотека, или шо-то другое, что должно быть сверх унифицировано), то он используется именно там, где он нафиг не нужен.
Слово придумали для того, чтобы можно было сделать все, что может только потребоваться. Я например не собираюсь использовать слово volatile в одно-поточном приложении. Но в c++ оно есть. При чем я его не буду использовать даже там, где теоретически я могу сделать доступ из несколько потоков (продумать на будущее, написать более унифицировано, так сказать), потому что у меня все равно приложение будет одно-поточное. оператор delete, кстати, туда же к friend. Т.е. я считаю, что в реальном проекте использовать его нельзя. Использовать его есть смысл только в небольших участках кода, которые требуют оптимизации, что по моему опыту не более 0.01% случаев и реальный коммерческий проект в них никогда не попадает. Это сообщение отредактировал(а) korian - 20.2.2013, 17:22 |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
По-моему опыту, браться на С++ писать что-то сверх унифицированное уже ошибка. Язык максимально ориентирован на статическое связывание решение системных высокопроизводительных задач. Все вкусняжки языка в шаблонах/ссылках/инлайнах/константах/типах времени компиляции. Короче, то что генерится на этапе компиляции. В STL/Boost виртуальных методов не встретишь. Как раз эти самые сильные связи наилучшее, что можно творить на С++ .
Ну если данные меняются в прерывании, то без него никуда. Что такое С++ ? Высокопроизводительные движки типа сервера бд (например firebird), драйвера и системные утилиты, движки 3D игр, веб сервера, математические движки типа Матлаб, среды симуляции LabView, прошивки контроллеров (ПЛК), элементы ОС. Как тут жить без volatile и friend потоков и прерываний? Про оператор delete вообще ![]() P.S. Чувствую, ща придется тему разделять и флуд отсюда отрезать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
как бы тот же boost я считаю уже чем-то сверх унифицированным, писать его - ошибка? и, в принципе, не понял, как весь первый абзац относится к friend? дайте реальный пример, где вы считаете, что friend необходим, я покажу вам, как от него избавиться. Причем в результате код получиться более читабельным. то же самое, дайте реальный пример, где вы считаете, что он нужен, я покажу как от него избавиться. Причем в результате код получиться более читабельным. где я написал, что эти слова в языке не нужны совсем? я такого не писал. |
|||
|
||||
Alexeis |
|
||||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Реальный пример будет не на одну сотню строк, так что вот псевдокод.
Так я и не опровергал утверждение, о том что они совсем не нужны. Я опровергал, то что они редко используются в реальных проектах на С++ . Специфика языка такова, что эти модификаторы не просто дополнительные придатки, а основной рабочий механизм. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
учитывая, что это псевдокод, то у для меня тут или в классе TaskA, функция UpdateInternalParentState должна быть public.
Или второй вариант (тоже псевдокод):
Не нравится передача указателя на функцию или функций больше чем одна - можно использовать интерфейс (в смысле полиморфизм). Это сообщение отредактировал(а) korian - 20.2.2013, 18:44 |
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |