| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > C++, инициализация вложенной структуры |
| Автор: vadiml 15.10.2007, 10:19 | ||||||
| Я создаю класс MyClass, потомка PrevClass, в котором есть структура: static const Qqqq qqqq; сама структура описана так:
сейчас эта структура инициализируется как
Я хочу убрать из определения этой структуры static и инициализировать её в конструкторе, чтоб у каждого экземпляра класса был свой вариант:
но ни как не придумаю как инициализировать вложенную структуру. Поменять Qqqq я не могу, т.к. она библиотечная. Что можно попробовать или где такое описано? |
| Автор: archimed7592 15.10.2007, 10:29 | ||
| Вообще нихрена не понятно: то ли ты хочешь убрать static(откуда? зачем он там вообще нужен был?), то ли ты уже убрал, но рассказываешь так, будто он там есть... Если у тебя настолько секретные имена классов/переменных, то постарайся хотя бы переименовать их везде одинакого.
|
| Автор: vadiml 15.10.2007, 11:26 |
| названия не секретные, они длинные а getQqqq() -- не подходит, т.к. здесь обращение к static const Qqqq. А мне надо разные экземпляры Qqqq() для разных экземпляров класса MyClass. Один общий экземпляр структуры Qqqq и сейчас есть. |
| Автор: vadiml 16.10.2007, 11:28 | ||||
| насколько я понимаю, самого конструктора ты пытаешься избежать Я его не пытаюсь избежать, это библиотечный класс (точнее библиотечная структура) без конструктора, но с вложенной структурой. а
помогло, хотя и чуть в другом виде:
наверное вложенную структуру только так и можно инициализировать |
| Автор: akizelokro 16.10.2007, 12:41 |
| Извини, но условия задачи не совсем понятны (хотя интересны). Вложенные структуры (например, вложенные классы) ты можешь инициализировать и по-другому. Здесь у тебя главную проблема - то, что вложенная структура идет со спецификатором const, иначе говоря, этот спецификатор требует для нее список инициализации (после этого она становится действительно const), ее нельзя прописать в теле конструктора. Ты можешь прописать список инициализации и в другом виде, но и указанный выше способ является достаточно корректным. С учетом того, что компилятор запретит тебе модифицировать const объект, но они включает в себя указатели, ты можешь модифицировать например сами char'ы, которые адресует const char * str. Это возможно, но является плохим стилем кодирования. Применять не рекомендую (если уж только корректный вариант не устраивает тебя ни в какую, - всякое бывает). Есть еще один совершенно "отвязный" фортель... Но, не думаю, что он тебе понадобится. |
| Автор: maxim1000 16.10.2007, 12:56 |
| вообще-то в условии константны не указатели, а данные, на которые они указывают так что можно без проблем их (указатели) менять в процессе работы... |
| Автор: archimed7592 16.10.2007, 13:07 | ||
У константного экземпляра(как в условии) будут константны все его члены, так что не судьба... |
| Автор: maxim1000 16.10.2007, 13:13 |
| а... недочитал... |
| Автор: akizelokro 16.10.2007, 14:44 | ||
Иными словами, примерный код (откомпилил, вроде работает)
|
| Автор: archimed7592 16.10.2007, 14:55 |
1. Зачем приводить buf к const char * да ещё и c-style кастом 0_о? Не доверяешь компилятору 2. Что ты этим кодом хотел показать? Я что-то мысль не уловил... |
| Автор: akizelokro 16.10.2007, 15:10 | ||||
Наоборот, компилятору я доверяю больше, чем себе
Протормозил. Сегодня дергают, вот я и урывками и мимоходом. Смысла в нем не было, и так понятно. |
| Автор: vadiml 16.10.2007, 17:45 | ||
| akizelokro, вообще-то, как я понял, для вложенной структуры следует писать
|
| Автор: archimed7592 16.10.2007, 17:47 |
Не обязательно |
| Автор: vadiml 16.10.2007, 17:49 |
| PS если кого интересует, что это за хитрая структура такая, то это QMetaObject из Qt4, а вложенная структура там помечена как private data, а влазить в нее пришлось, чтоб сделать систему сигналов-слотов динамической, т.е. имея одно описание класса, каждый экземпляр мог иметь свои сигналы-слоты и они задавались при инициализации класса. |
| Автор: akizelokro 17.10.2007, 08:59 | ||
прошу прощения, времени не было и я, соответственно.. накорябал пример как быстрее. А вообщем, можно и сами указатели можно менять через const_cast в любое время. |