crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Работа с собственными классами
RazrFalcon
  опции профиля:
сообщение 27.8.2011, 10:23
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Есть свой собственный класс, наследник от QObject.
Этот класс хранит инфо об одном файле. Классов создается столько, сколько файлов (через new).
MyClass *fileInfo = new MyClass;

Вопрос: как затем в коде программы получить список ВСЕХ MyClass?

Кроме как через static_cast ничего в голову не приходит. Может есть другой, более правильный, метод?


PS: название темы лучше придумать не смог...

Сообщение отредактировал RazrFalcon - 27.8.2011, 10:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.8.2011, 10:35
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 27.8.2011, 13:23) *
как затем в коде программы получить список ВСЕХ MyClass?
всех объектов? или все собственных классов?

Если объектов, то нужно этот список создавать самому, например:
QList<MyClass *> myClasses;
...
MyClass *obj = new MyClass(...);
myClasses << obj;

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 27.8.2011, 10:47
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


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

Я просто думал сделать через qobject_cast, но не пойму как найти все итемы одного класса через него.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.8.2011, 18:18
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


сделай статический член класса MyClass - вектор указателей на экземпляры. В конструкторе myClasses добавляй туда элемент this, в деструкторе удаляй. Учитывай многопоточность. Учитывай переаллокацию списка при большом количестве создаваемых объектов (это не сложно - можно зарезервировать вызовом статической функции класса MyClass)

также учитывай, что если объекты MyClass будешь создавать в std::vector , то конструктор вызовется не для каждого элемента. К примеру

std::vector<MyClass> v(10); //конструктор MyClass() вызовется 1 раз


Сообщение отредактировал Алексей1153 - 27.8.2011, 18:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.8.2011, 19:45
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 27.8.2011, 21:18) *
сделай статический член класса MyClass - вектор указателей на экземпляры. В конструкторе myClasses добавляй туда элемент this, в деструкторе удаляй.
Отличная мысль!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 27.8.2011, 21:44
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ничего не понял <_<
std то тут причем =/

Юзаю QList - пока норм.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 28.8.2011, 11:23
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата
Отличная мысль!

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

RazrFalcon, это я подчеркнул особенность работы вектора. Насчёт поведения QVector - не проверял, QList же, скорее всего, вызывает конструкторы исправно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.8.2011, 18:15
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 28.8.2011, 0:44) *
Ничего не понял
Цитата(Алексей1153 @ 27.8.2011, 21:18) *
сделай статический член класса MyClass - вектор указателей на экземпляры. В конструкторе myClasses добавляй туда элемент this, в деструкторе удаляй.

Заводишь статическую переменную в классе и статическую функцию чтения из неё:
class MyClass
{
private:
    static QList<MyClass *> m_instances;
public:
    static QList<MyClass *> instances()
    {
        return m_instances;
    }

    MyClass()
    {
        m_instances << this;
    }

    ~MyClass()
    {
        m_instances.removeOne(this);
    }
}

Используешь так:
MyClass *obj_1 = new MyClass();
QList<MyClass *> list = MyClass::instances(); // Вызываем статическую функцию класса, Печатает "1"
qDebug() << "Count of MyClass = " << list.size();

MyClass *obj_2 = new MyClass();
qDebug() << "Count of MyClass = " << MyClass::instances().size(); // Печатает "2"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 12:56