![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ksili |
|
||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Проблема такова. Я делаю в Билдере многопоточное приложение. Для этого в нём предусмотрен класс TThread. Все потоки, создаваемые приложением должны быть потомками этого класса. У меня несколько таких потомков. Всё было нормально, пока я не захотел несколько членов этих классов сделать константными т.к. они собственно константами и являются (их значение задаётся в самом начале, и потом не меняется). Сделать это я решил, т.к. в разных местах говорится, что это гуд (см. например, С.Мэйерс "Эффективное использование С++"), но не в этом суть. Сделать-то я их сделал такими, а инициализировать не получается.
Вот как они инициализировались раньше:
Конструктор, который при этом использовался, выглядит так:
После того, как я сделал члены класса hCom, this_ch, All_ch константными, так уже делать нельзя, т.к. они инициализируются при вызове конструктора, а не после, как показано выше. Тут, насколько я понял, почитав книжки, нужно использовать конструктор со списком инициализации. Но нигде не нашёл, как это сделать именно для такого случая (конструктор производного класса). Если бы класс не был производным, его конструктор выглядел бы примерно так:
А создание объекта примерно так:
Но из-за того, что там уже есть : TThread(CreateSuspended), я не пойму куда там впихнуть список инициализации. Пробовал так:
так
так
и другими подобными способами. Не компилируется. Пишет ошибки { expected и Declaration terminated incorrectly на конструкторе (на этом самом списке инициализации). Кто-нибудь знает, как можно инициализировать константные члены-данные в производном классе? Это сообщение отредактировал(а) ksili - 17.7.2008, 09:07 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||||||||||
|
|||||||||||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Так много букв написал, что в этой жаре все подробно прочитать просто никак...
![]() Но если правильно поняла: константу можно инициализировать только в списке инициализации того класса, где она объявлена. А производный класс может только передать желаемый аргумент базовому. Примерно так:
Это сообщение отредактировал(а) Earnest - 17.7.2008, 09:11 -------------------- ... |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Нужно вызывать конструктор базового класса для инициализации членов базового класса
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
И вообще, прямо инициализировать переменные базового класса в конструкторе производного, даже если это не константы, - плохая идея. Хорошая - сделать их приватными.
-------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Earnest, немного не то. Константы и есть в производном классе, в секции public. Я в базовом классе ничего не меняю - он не мой.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Тогда никак. Члена-константы можно инициализировать только в списке инициализации своего конструктора.
Если базовый класс не предусматривает аргументов для альтернативной инициализации своих констант, то вопросы к его автору. Возможно, есть какая-то сермяга. И если базовый класс не твой, то откуда там взялись константы, которых раньше не было? А константы производного класса инициализуруй на здоровье - в списке инициализации. -------------------- ... |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Дык, вот как раз это и не получается! ![]() -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вместо второго двоеточия поставь запятую :
Добавлено через 4 минуты и 21 секунду полностью согласен, ksili, задавая вопрос постарайся не отходить на дополнительные описания ...трудно понять где именно проблема.. ![]() Это сообщение отредактировал(а) mes - 17.7.2008, 09:27 |
|||
|
||||
Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Не может быть проблемы в несоответствии порядка объявления порядку в листе инициализации? В списке инициализации должны упоминаться сначала базовые классы, потом члены в порядке их объявления в классе. В случае константых членов это важно. В Новых сложных задача Саттера есть совет (14-ый), где он это подробно рассматривает.
-------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
ksili |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Я так уже пробовал. При компиляции всё те же ошибки на строке
Добавлено @ 09:55
Я сейчас пробую с одним параметром в инициализации
и даже вернул его назад на неконстантный, на всякий случай. Всё равно не компилируется Это сообщение отредактировал(а) ksili - 17.7.2008, 09:56 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||||||
|
|||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ksili, покажи описание класса и код ошибки
Это сообщение отредактировал(а) mes - 17.7.2008, 10:19 |
|||
|
||||
ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
DispatchThread.h
DispatchThread.cpp
другого конструктора нету. Класс TThread не мой - объявлен в Classes.hpp В основном процессе экземпляр моего класса TDispatchThread создается так:
Коды ошибок: E2275 { expected E2040 Declaration terminated incorrectly обе ошибки на одной строке в DispatchThread.cpp: : TThread(CreateSuspended) -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а попробуй написать так
т.е в одну строку. |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
vinter, ничего не изменилось
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
на вид все правильно у тебя, проверька на своем компиляторе этот код :
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |