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

Поиск:

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


Hacker
****


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

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



Предположим, что есть структура типа 

Код

struct MyStruct
{
    mytype *country,
    *book,
    *author,
    *pages,
    *language,
    ... и т.д. элементов 20 или более
    int item;
    double number;
};


Так вот как в цикле удалить указатели из этой структуры, чтобы освободить память, при этом, чтобы оставить возможность обращаться к этим указателям по имени и не городить башню типа:

Код

delete i.country;
delete i.book;
delete i.author;
...


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

Я знаю одно решение, которое использует адресную арифметику и увеличивает указатель на начало первого указателя до тех пор, пока адрес не станет больше указателя на последний элемент. Но имхо это не правильно.

Использовать всякие hashmap'ы я не хочу. Может просто в структуре объявить массив указателей, а в отдельной структуре описать имена каждого элемента. Когда нужен поименный доступ буду "кастовать" этот массив в структуру, когда нужно удаление - буду пробегаться по массив. 


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mrbrooks
Дата 30.12.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 19
Всего: 306



Может просто использовать конструктор-деструктор.
PM MAIL   Вверх
GoldFinch
Дата 30.12.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 6
Всего: 26



или писать на ЯП с автоматическим сбором мусора
PM MAIL ICQ   Вверх
SABROG
Дата 30.12.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mrbrooks @  30.12.2008,  10:21 Найти цитируемый пост)
Может просто использовать конструктор-деструктор. 


А смысл, если в том же деструкторе придется прописывать многоэтажное удаление ?

Цитата(GoldFinch @  30.12.2008,  11:19 Найти цитируемый пост)
или писать на ЯП с автоматическим сбором мусора 


Намек на Java понят, но что если проекту уже несколько лет и он на C++ smile ? (проекта нет на самом деле, это гипотетически)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
pan2004
Дата 30.12.2008, 11:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А использовать умные указатели? Да тот же shared_ptr<> освободит от необходимости писать кучу delete.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
SABROG
Дата 30.12.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(pan2004 @  30.12.2008,  11:49 Найти цитируемый пост)
А использовать умные указатели? Да тот же shared_ptr<> освободит от необходимости писать кучу delete. 


А его можно использовать с библиотеками, которые не знают о существовании умных указателей ? Например у метода чужого класса параметр mytype * и больше никакой ? Если я получу указатель через get() и передам его в метод. Метод его поюзает и вернет управление. Все, теперь мне надо удалить указатель. Не удалится же он сам ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
pan2004
Дата 30.12.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
А его можно использовать с библиотеками, которые не знают о существовании умных указателей

Можно, главное чтобы эти библиотеки не брали на себя шефство над этими указателями, те например не пытались их удалять.

Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
Например у метода чужого класса параметр mytype * и больше никакой ? Если я получу указатель через get() и передам его в метод. Метод его поюзает и вернет управление.

Это безопасно, если метод не пытается сохранить этот указатель где то у себя внутри, тогда надо следить, чтобы время жизни такого "неуправляемого" указателя было не больше чем у shared.

Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
Все, теперь мне надо удалить указатель. Не удалится же он сам ?

shared_ptr<> удалит объект на который он указывает сам, как только запустится деструктор последнего shared_ptr, указывающего на этот объект.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
mes
Дата 30.12.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  11:35 Найти цитируемый пост)
А смысл, если в том же деструкторе придется прописывать многоэтажное удаление ?

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

Пример какой то надуманный.. Чего от Вы не договариваете.. 

Также не понятно:
  являются ли объекты "собственностью " указателей ?
  если да, то почему выбрано хранение объекта в структуре по указателю, а не по значению ?
  какая логика должна быть при копировании структуры ?
...
 



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


Hacker
****


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

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



Цитата(pan2004 @  30.12.2008,  12:24 Найти цитируемый пост)
Это безопасно, если метод не пытается сохранить этот указатель где то у себя внутри, тогда надо следить, чтобы время жизни такого "неуправляемого" указателя было не больше чем у shared.

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

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
В деструкторе прописывается один раз, а если удалять в коде программы, то при изменении структуры надо будет найти все места, где происходило удаление.

В принципе очистка и так в деструкторе идет, но в стороннем классе, который использует эти структуры. Место хоть и одно, но с  точки зрения оптимизации 20 инструкций delete идущих подряд в бинарнике, вместо цикла с адресной арифметикой, не очень нравится.

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
Пример какой то надуманный.. Чего от Вы не договариваете.. 

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

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
Также не понятно:
  являются ли объекты "собственностью " указателей ?
  если да, то почему выбрано хранение объекта в структуре по указателю, а не по значению ?
  какая логика должна быть при копировании структуры ?

Нет, объекты - классы сторонней библиотеки, чья реализация завуалирована и не поддается редактированию smile
Структуры просто помещаются в массив. Предположим, каждая структура - родитель в treeview, а указатели этой структуры - детки.

Все-таки давайте не отклонятся от первоначальной темы в сторону перепроектирования приложения. Проекта нет и ситуация чисто гипотетическая.

Это сообщение отредактировал(а) SABROG - 30.12.2008, 13:20


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  13:16 Найти цитируемый пост)
. Место хоть и одно, но с  точки зрения оптимизации 20 инструкций delete идущих подряд в бинарнике, вместо цикла с адресной арифметикой, не очень нравится.

ИМХО, лучше  смотреть с точки зрения логичности и подерживаемости кода.

Цитата(SABROG @  30.12.2008,  13:16 Найти цитируемый пост)

Нет, объекты - классы сторонней библиотеки, чья реализация завуалирована и не поддается редактированию smile

А при чем тут реализация объектов ?

Вобщем хоть и не понял что Вам надо, вот попытаюсь для начала условный набросок дать:

Код

   enum ENum { eCountry, eBook, eAuthor, ePages, eLanguage, eDummy };

class MyClass
{
    mytype * m_data[eDummy]; // наши данные 
                                                 //  насколько я понял из вашего объяснения, Вам сама структура как таковая и не нужна,
                                                 //  в таком случае m_data заменяет ее.

 public:

   mytype * ByNum (int num)  { return  m_data[num]; }  // обращение по индексу

   mytype * Country () { return m_data[eCountry]; } // прокси функция для доступа к элементу
   mytype * Book ()    { return m_data[eBook]; }      //  с точки зрения оптимизации :) нагрузки в релизе не будет 

};





Это сообщение отредактировал(а) mes - 30.12.2008, 13:41


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


Hacker
****


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

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



Вот о чем я говорю. Метод с enum отбросил из-за некоторой кривизны доступа к именам объектов, хотя в виде класса смотрится неплохо.

Код

#include <iostream>

struct itest
{
    int *item1,
        *item2,
        *item3,
        *item4,
        *item5;
};

struct stest
{
    int *items[sizeof(itest)/sizeof(int *)];
    double dnumber;
    unsigned char c;
};


int main(int argc, char *argv[])
{
    stest tst;
    itest &itst = reinterpret_cast<itest &>(tst.items);
    itst.item1 = new int(1);
    itst.item2 = new int(2);
    itst.item3 = new int(3);
    itst.item4 = new int(4);
    itst.item5 = new int(5);

    for (int i=0; i < sizeof(itest)/sizeof(int *); i++)
    {
        std::cout << *tst.items[i] << std::endl;
        delete tst.items[i];
    }
    return 0;
}



Т.е. тут достаточно менять список итемов в структуре-интерфейсе. Об остальном программа заботится сама.

Это сообщение отредактировал(а) SABROG - 30.12.2008, 13:55


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
Т.е. тут достаточно менять список итемов в структуре-интерфейсе. Об остальном программа заботится сама.

Удачи и будем надеяться, что "крах " не коснется Вашей конструкции.  smile 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



 smile 
Если бы это написал мой подчиненны, я бы заставил переписывать...
И вообще, с некоторых пор для этих целей использую std::auto_ptr. И стараюсь не юзать его с new вне классов...
PM   Вверх
SABROG
Дата 30.12.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.12.2008,  15:56 Найти цитируемый пост)
Удачи и будем надеяться, что "крах " не коснется Вашей конструкции. 


В каком месте smile ? Всякое конечно может быть. Особенно, если компилятору вздумается размещать данные не по порядку.

Цитата(bsa @  30.12.2008,  16:05 Найти цитируемый пост)
Если бы это написал мой подчиненны, я бы заставил переписывать...
И вообще, с некоторых пор для этих целей использую std::auto_ptr. И стараюсь не юзать его с new вне классов... 

А что именно не нравится, сама задача или то как я реализовал и у тебя есть третий вариант ее решения smile ? Или ты имеешь ввиду, что не замарачивался бы вообще с этим и прописывал все ручками ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
В каком месте smile ? Всякое конечно может быть. 

Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
    int *items[sizeof(itest)/sizeof(int *)];

 Вы не учитываете выравнивание...(хотя Вам повезет, так как размер указателя на обычных архитектурах  "попадает на границу выравнивания".)

Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
Особенно, если компилятору вздумается размещать данные не по порядку.

А вот этого не вздумается. )

Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
А что именно не нравится, сама задача или то как я реализовал и

Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
   itest &itst = reinterpret_cast<itest &>(tst.items);

Хотя бы то, что способ использования определен "далеко" от декларации.

Это сообщение отредактировал(а) mes - 30.12.2008, 18:48


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(SABROG @ 30.12.2008,  16:49)
А что именно не нравится, сама задача или то как я реализовал и у тебя есть третий вариант ее решения smile ? Или ты имеешь ввиду, что не замарачивался бы вообще с этим и прописывал все ручками ?

Вернемся к исходной задаче. Тебе лень удалять кучу разных объектов, память под которые выделена динамически. Для этого лучше использовать std::auto_ptr (особенно, когда нет задачи передавать указатель за пределы объекта его содержащего).
А по поводу того, что в итоге получилось - это просто непонятно что, непонятно для чего и непонятно что делает. Другими словами, это отход от приципа: "программа пишется для программиста, а не для компьютера". Может оно и оптимально по скорости, но я бы на твоем месте подумал о будущем - что ты будешь делать с этим через пару месяцев.
PM   Вверх
SABROG
Дата 30.12.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.12.2008,  17:15 Найти цитируемый пост)
Хотя бы то, что способ использования определен "далеко" от декларации.


А как сделать, чтобы было "близко" ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 30.12.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(bsa @  30.12.2008,  17:27 Найти цитируемый пост)
Тебе лень удалять кучу разных объектов, память под которые выделена динамически. Для этого лучше использовать std::auto_ptr (особенно, когда нет задачи передавать указатель за пределы объекта его содержащего).

Мне не лень, просто слишком много данных придется держать в памяти, чтобы не забыть где-то добавить удаление добавленного параметра. Да и задача передачи указателя за пределы объекта есть, тот код, что я написал всего-лишь отражение моих желаний.

Цитата(bsa @  30.12.2008,  17:27 Найти цитируемый пост)
Может оно и оптимально по скорости, но я бы на твоем месте подумал о будущем - что ты будешь делать с этим через пару месяцев. 


Написал и забыл smile Через пару месяцев я с этим точно ничего делать не буду. Вспоминается одно из правил плохого тона программирования: "временные решения очень быстро становятся постоянными".

P.S.: снял пометку о решении. Раз местным гуру не нравится такой вариант, остается ждать либо другого решения, либо ответа почему подобная ситуация не должна возникать в принципе...

Это сообщение отредактировал(а) SABROG - 30.12.2008, 18:29


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Мне не лень, просто слишком много данных придется держать в памяти, чтобы не забыть где-то добавить удаление добавленного параметра. 

Как раз своей новой конструкцией Вы и обременили себе память. 

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Да и задача передачи указателя за пределы объекта есть, тот код, что я написал всего-лишь отражение моих желаний.

Не понял.

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
Написал и забыл smile Через пару месяцев я с этим точно ничего делать не буду.

Один раз написал - забыл, второй, а в третий так вылезет, что мало не покажется.  smile 

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
. Вспоминается одно из правил плохого тона программирования: "временные решения очень быстро становятся постоянными"

вот вот  smile 


Цитата(SABROG @  30.12.2008,  17:31 Найти цитируемый пост)
А как сделать, чтобы было "близко" ? 

"Далеко" это как например внутри Get-функции создавать объект который должен быть удален снаружи.
А "близко" это то что создано в конструкторе- удаляeтся в деструкторе.

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

Цитата(SABROG @  30.12.2008,  18:19 Найти цитируемый пост)
остается ждать либо другого решения, либо ответа почему подобная ситуация не должна возникать в принципе...

Для решения нужно как минимум понять, что требуется и как это будет использовано.


Это сообщение отредактировал(а) mes - 30.12.2008, 18:49


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



SABROG, для начала попробуй описать что ты хочешь получить в итоге (методы реализации на данном этапе не интересны).
Например, то что ты написал в первом сообщении можно сделать так:
Код
struct MyStruct
{
    std::auto_ptr<mytype> country;
    std::auto_ptr<mytype> book;
    std::auto_ptr<mytype> author;
    std::auto_ptr<mytype> pages;
    std::auto_ptr<mytype> language;
    ... и т.д. элементов 20 или более
    int item;
    double number;
};
Теперь, для получения просто указателя нужно применить метод get(). Для (пере)присвоения значения указателю - метод reset(). Для доступа к содержимому - стандартный синтаксис (унарная * или ->). delete будет вызван автоматически при уничтожении экземпляра объекта MyStruct.
Но я не уверен, что это все нужно городить, так как мне кажется сама идея хранения такого большого списка однотипных параметров нелогичной. Может стоит сделать как-то иначе?
PM   Вверх
SABROG
Дата 30.12.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(bsa @  30.12.2008,  18:51 Найти цитируемый пост)
Но я не уверен, что это все нужно городить, так как мне кажется сама идея хранения такого большого списка однотипных параметров нелогичной. Может стоит сделать как-то иначе? 


Предположим есть treeview, который является Property Editor'ом для какой-нибудь IDE или просто редактор БД.
Несмотря на то, что каждый параметр имеет свой тип, сами итемы этого treeview - одного класса. В итоге 10 строковых параметров, 5 интовых, 4 блоба, 8 флоат - все указатели имеют один тип - элемент treeview.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  19:26 Найти цитируемый пост)
Несмотря на то, что каждый параметр имеет свой тип, сами итемы этого treeview - одного класса. В итоге 10 строковых параметров, 5 интовых, 4 блоба, 8 флоат - все указатели имеют один тип - элемент treeview. 


То есть у нас есть структура которое содержит n-e кол-во наследников одного типа. Тут понятно.. Но пока видим только массив.
 Продолжайте.  smile 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @ 30.12.2008,  19:37)
Но пока видим только массив.

Аналогично
PM   Вверх
SABROG
Дата 30.12.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Ну да, видим массив. Но массив то с ограниченным количеством элементов. Как говорится, уже нельзя всех под одну гребенку (сорри после корпоратива, мозга не варит и в квартире воняет протухшей рыбой).

Это сообщение отредактировал(а) SABROG - 30.12.2008, 21:57


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  30.12.2008,  21:56 Найти цитируемый пост)
Ну да, видим массив. Но массив то с ограниченным количеством элементов. 

и что это меняет ? 
Разница возникнет, тогда, когда Вам 
1. либо надо знать конкретный тип каждого/определенного элемента
2. либо обращаться к элементу по имени (опять же известно ли имя на момент компиляции? и полезна ли даная известность ?)



--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



SABROG, не вижу проблем с ограниченностью количества элементов. Почему нельзя написать в структуре mytype *items[20]?
PM   Вверх
SABROG
Дата 31.12.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



А параметры проверять так чтоль ?

Код

items[0]->text();


Вместо

Код

root->title->text();



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 31.12.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  31.12.2008,  11:06 Найти цитируемый пост)
А параметры проверять так чтоль ?

а почему бы не root->title()->text();  или  даже root()->title()->text();  ?
если конечно статические имена в Вашем случае удобны чем динамические.


Это сообщение отредактировал(а) mes - 31.12.2008, 12:41


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


Hacker
****


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

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



Цитата(mes @ 31.12.2008,  12:41)
Цитата(SABROG @  31.12.2008,  11:06 Найти цитируемый пост)
А параметры проверять так чтоль ?

а почему бы не root->title()->text();  или  даже root()->title()->text();  ?
если конечно статические имена в Вашем случае удобны чем динамические.

С массивом я такое смогу провернуть только если создам класс как уже писали тут http://forum.vingrad.ru/index.php?showtopi...t&p=1743811

auto_ptr использовать опасно т.к. treeview может сам удалить указатель.

Это сообщение отредактировал(а) SABROG - 31.12.2008, 13:11


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 31.12.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  31.12.2008,  13:06 Найти цитируемый пост)
auto_ptr использовать опасно т.к. treeview может сам удалить указатель.

а "вручную" как Вы узнаете что treeview уже удалил элемент и его не надо удалять?

Цитата(SABROG @  31.12.2008,  13:06 Найти цитируемый пост)
только если создам класс 

пока Вы не привели ни одного довода, для создания той структуры о которой идет речь. 
Как я понял у Вас есть treview с элементами. Вы делаете его маппинг. Т.е Ваша структура служит посредником для доступа к определенным полям.
В таком случае использование открытой структуры, внесет Вам большой ряд проблем.
Если доступ к элементам будет "разгружен" функцией, то Вы отгородите реализацию "компонента" от остальной программы.

Все таки до сих пор не понятно, важно ли для самой программы (ее бизнес-логики) знание статического имени.
можно ведь вместо  root()->title()->text(); использовать динамическое имя root()->node(title)->text().

ну а можно статическое root()->node<title>()->text(). (для удобства только придется у Александреску позаимствовать шаблоны TypeList и некоторые другие)




Это сообщение отредактировал(а) mes - 31.12.2008, 14:06


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 1.1.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  31.12.2008,  14:04 Найти цитируемый пост)
а "вручную" как Вы узнаете что treeview уже удалил элемент и его не надо удалять?


Метод setItem устанавливает указатель типа treeviewitem в treeview, при этом treeview delete'ит старый указатель (если итем подменяется новым) и ставит новый.


Цитата(mes @  31.12.2008,  14:04 Найти цитируемый пост)
Все таки до сих пор не понятно, важно ли для самой программы (ее бизнес-логики) знание статического имени.
можно ведь вместо  root()->title()->text(); использовать динамическое имя root()->node(title)->text().

ну а можно статическое root()->node<title>()->text(). (для удобства только придется у Александреску позаимствовать шаблоны TypeList и некоторые другие)


Для самой программы - не важно. Её хоть на опкодах пиши. Правда выйдет подольше. Это я к теме о доступе к массиву указателей по индексам. Как вариант конечно можно еще просто комментарии вставлять, типа:

Код

string title = items[0]->text(); // получаем title
string author = items[1]->text(); // получаем author


"<title>" это какой тип ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 1.1.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(SABROG @  1.1.2009,  19:51 Найти цитируемый пост)

Для самой программы - не важно. Её хоть на опкодах пиши. 

Вы не так поняли, о чем я говорил. 
Я интересовался нужно ли программе знать, что бывает title. Или достаточно знать что есть список свойств.

Цитата(SABROG @  1.1.2009,  19:51 Найти цитируемый пост)
string title = items[0]->text(); // получаем title 
string author = items[1]->text(); // получаем author

в данном случае программе известно, что бывает title.

a в данном :
Код

string name = items[0]->name(); //имя например title, language, country
string text   = items[0]->text(); 

нет.

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

Цитата(SABROG @  1.1.2009,  19:51 Найти цитируемый пост)

"<title>" это какой тип ? 

имя класса, примерно (не точно помню названия шаблонов в библиотеке, а смотреть лень  smile ) выглядело бы так :

Код

class Title :  public Item {};
class Author : public Item {};
typedef Loki::TypeList<Title, Author> myStructTypes;

class Object {
 vector<Item*> m_vect;
 public:
   Object () { m_vect.resize(Loki::TypeListLenght<myStructTypes>); }
   template <class T> Item * Node () { return m_vect.at(Loki::TypeIndex<T, myStructTypes>); }
};



 но можно подобное и с енумом/интом. Зависит от целей.




--------------------
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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