Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++, инициализация вложенной структуры 
V
    Опции темы
vadiml
Дата 15.10.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



Я создаю класс MyClass, потомка PrevClass, в котором есть структура:
static const Qqqq qqqq;
сама структура описана так:
Код

struct Qqqq {
    /* куча функций, но конструктора нет */
    struct {
        const Qqqq *prev;
        const char * str;
        const int *data;
    } d;
}


сейчас эта структура инициализируется как
Код

const Qqqq MyClass::qqqq = {
    { &PrevClass::qqqq, stringdata_MyClass, meta_data_MyClass }
};


Я хочу убрать из определения этой структуры static и инициализировать её в конструкторе, чтоб у каждого экземпляра класса был свой вариант:
Код

MyClass::MyClass ()
 : PrevClass(), qqqq( /*???*/ )
{

}

но ни как не придумаю как инициализировать вложенную структуру. 
Поменять Qqqq я не могу, т.к. она библиотечная.

Что можно попробовать или где такое описано?

PM MAIL Jabber   Вверх
archimed7592
Дата 15.10.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Вообще нихрена не понятно: то ли ты хочешь убрать static(откуда? зачем он там вообще нужен был?), то ли ты уже убрал, но рассказываешь так, будто он там есть...

Если у тебя настолько секретные имена классов/переменных, то постарайся хотя бы переименовать их везде одинакого.

Цитата(vadiml @  15.10.2007,  10:19 Найти цитируемый пост)
MyClass::MyClass ()
 : PrevClass(), qqqq( /*???*/ )
{
}

Код


namespace
{
    const Qqqq &getQqqq()
    {
        static const Qqqq qqqq = { /* ... */ };
        return qqqq
    }
}

MyClass::MyClass ()
 : PrevClass(), qqqq(getQqqq())
{
    /* ... */
}


Это сообщение отредактировал(а) archimed7592 - 15.10.2007, 10:30


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
vadiml
Дата 15.10.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



названия не секретные, они длинные smile

а getQqqq() -- не подходит, т.к. здесь обращение к static  const Qqqq. А мне надо разные экземпляры Qqqq() для разных экземпляров класса MyClass. 

Один общий экземпляр структуры Qqqq и сейчас есть.

Это сообщение отредактировал(а) vadiml - 15.10.2007, 11:30
PM MAIL Jabber   Вверх
archimed7592
Дата 15.10.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(vadiml @  15.10.2007,  11:26 Найти цитируемый пост)
а getQqqq() -- не подходит, т.к. здесь обращение к static  const Qqqq. А мне надо для разные Qqqq() для разных экземпляров класса MyClass 

Разные на основании чего? Твой конструктор не принимает аргументов, так что мне сложно одуплить как они могут быть разными, но, тем не менее:
Код

namespace
{
    const Qqqq getQqqq(const A1 a1, const A2 a2, const A3 a3)
    {
        const Qqqq qqqq = { a1, a2, a3 };
        return qqqq
    }
}
MyClass::MyClass ()
 : PrevClass(), qqqq(getQqqq(a1, a2, a3))
{
    /* ... */
}

Что по сути является рукописным конструктором, но, насколько я понимаю, самого конструктора ты пытаешься избежать чтобы сохранить статус структуры POD, так? Если нет, то просто напиши ей конструктор и делай так:
Код

MyClass::MyClass ()
 : PrevClass(), qqqq(a1, a2, a3)
{
    /* ... */
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
vadiml
Дата 16.10.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



насколько я понимаю, самого конструктора ты пытаешься избежать

Я его не пытаюсь избежать, это библиотечный класс (точнее библиотечная структура) без конструктора, но с вложенной структурой.

а
Код

namespace
{
    const Qqqq getQqqq(const A1 a1, const A2 a2, const A3 a3)
    {
        const Qqqq qqqq = { a1, a2, a3 };
        return qqqq
    }
}

помогло, хотя и чуть в другом виде:
Код

namespace  {
    const Qqqq getQqqq(const char *stringdata, const uint *data) {
        const Qqqq q = { { &PrevClass:qqqq, stringdata, data, 0 } };
        return q;
    }
}

наверное вложенную структуру только так и можно инициализировать

PM MAIL Jabber   Вверх
akizelokro
Дата 16.10.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Извини, но условия задачи не совсем понятны (хотя интересны).
Вложенные структуры (например, вложенные классы) ты можешь инициализировать и по-другому. Здесь у тебя главную проблема - то, что вложенная структура идет со спецификатором const, иначе говоря, этот спецификатор требует для нее список инициализации (после этого она становится действительно const), ее нельзя прописать в теле конструктора. Ты можешь прописать список инициализации и в другом виде, но и указанный выше способ  является достаточно корректным.
С учетом того, что компилятор запретит тебе модифицировать const объект, но они включает в себя указатели, ты можешь модифицировать например сами char'ы, которые адресует const char * str.  Это возможно, но является плохим стилем кодирования. Применять не рекомендую (если уж только корректный вариант не устраивает тебя ни в какую, - всякое бывает).

Есть еще один совершенно "отвязный" фортель... Но, не думаю, что он тебе понадобится.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
maxim1000
Дата 16.10.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



вообще-то в условии константны не указатели, а данные, на которые они указывают
так что можно без проблем их (указатели) менять в процессе работы...


--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 16.10.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(maxim1000 @  16.10.2007,  12:56 Найти цитируемый пост)
вообще-то в условии константны не указатели, а данные, на которые они указывают
так что можно без проблем их (указатели) менять в процессе работы...


Цитата(vadiml @  15.10.2007,  10:19 Найти цитируемый пост)
static const Qqqq qqqq;

У константного экземпляра(как в условии) будут константны все его члены, так что не судьба...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 16.10.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



а... недочитал...


--------------------
qqq
PM WWW   Вверх
akizelokro
Дата 16.10.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Иными словами, примерный код (откомпилил, вроде работает)

Код

struct Qqqq {
    struct {
        const Qqqq *prev;
        const char * str;
        const int *data;
    } d;
};

char buf[1000];
const Qqqq something(const Qqqq *, const char* str, const int *)
{
    Qqqq q1= {NULL, str, NULL};
    return q1;
};

class MyClass
{
const struct Qqqq qqqq;
public:
MyClass::MyClass():qqqq(something(NULL, (const char *)buf, NULL)) {};
};

int main(int argc, char* argv[])
{
MyClass m;
buf[0] = '\0';


Это сообщение отредактировал(а) akizelokro - 16.10.2007, 14:45


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 16.10.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  16.10.2007,  14:44 Найти цитируемый пост)
Иными словами, примерный код (откомпилил, вроде работает)

1. Зачем приводить buf к const char * да ещё и c-style кастом 0_о? Не доверяешь компилятору smile?
2. Что ты этим кодом хотел показать? Я что-то мысль не уловил...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 16.10.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Не доверяешь компилятору


Наоборот, компилятору я доверяю больше, чем себе smile 

Код

Что ты этим кодом хотел показать? Я что-то мысль не уловил...
 

Протормозил. Сегодня дергают, вот я и урывками и мимоходом. Смысла в нем не было, и так понятно.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
vadiml
Дата 16.10.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



akizelokro, 

Цитата(akizelokro @  16.10.2007,  14:44 Найти цитируемый пост)
Qqqq q1= {NULL, str, NULL};


вообще-то, как я понял, для вложенной структуры следует писать 
Код

Qqqq q1= { {NULL, str, NULL} };



PM MAIL Jabber   Вверх
archimed7592
Дата 16.10.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(vadiml @  16.10.2007,  17:45 Найти цитируемый пост)
вообще-то, как я понял, для вложенной структуры следует писать 

Не обязательно smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
vadiml
Дата 16.10.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



PS если кого интересует, что это за хитрая структура такая, то это QMetaObject из Qt4, а вложенная структура там помечена как private data, а влазить в нее пришлось, чтоб сделать систему сигналов-слотов динамической, т.е. имея одно описание класса, каждый экземпляр мог иметь свои сигналы-слоты и они задавались при инициализации класса.

Это сообщение отредактировал(а) vadiml - 16.10.2007, 17:52
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.