Russian Qt Forum
Декабрь 23, 2024, 10:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с доступом к члену класса  (Прочитано 3763 раз)
M9yT
Гость
« : Ноябрь 13, 2010, 20:13 »

Всем привет.
Есть некоторый класс
Код:
class address{
protected:
        QString adrs; //адрес
public:
        address();
        address(QString _adrs);
        virtual QString get_name(){return adrs;}
};
и управляющий класс
Код:
typedef QVector<address*> MyCollection;

class Programm{
private:
        MyCollection *collection;
public:
        void Init(){collection = new MyCollection; }
        //......другие методы
        void addToCollection(address *);
};

void Programm::addToCollection(address *p)
{
    collection->push_back(p);
}

Код:
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "id.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    Programm pr;   //создал объект типа Programm
    pr.Init();         //инициализировал collection
    w.show();

    return a.exec();
}
Мне нужно, чтобы при создании нескольких объектов переменная collection оставалась единственной( в нее я записываю объекты класса address). Но, чтобы вызвать addToCollection(ID *), я должен каждый раз создать новый объект Programm (этот метод я вызываю в других файлах программы;), следовательно создается новая переменная collection. Как избежать этого, не используя static.
« Последнее редактирование: Ноябрь 13, 2010, 22:24 от M9yT » Записан
Nimbus
Гость
« Ответ #1 : Ноябрь 13, 2010, 20:48 »

Синглтон, наверное
Записан
M9yT
Гость
« Ответ #2 : Ноябрь 13, 2010, 20:51 »

Синглтон, наверное
А поподробнее?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 13, 2010, 21:54 »

>>Как избежать этого, не используя static.
ни как
Записан

Юра.
BlackTass
Гость
« Ответ #4 : Ноябрь 14, 2010, 13:57 »

Ну да, два варианта собственно. Либо делаем его статиком, либо делаем класс Programm синглтоном (http://en.wikipedia.org/wiki/Singleton_pattern)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Ноябрь 14, 2010, 14:09 »

>>либо делаем класс Programm синглтоном
который внутри содержит переменную статическую и соответствующий статический метод.
статика - единственный вариант в Си++
Записан

Юра.
andrew.k
Гость
« Ответ #6 : Ноябрь 14, 2010, 18:24 »

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

class Program
{
 private:
  Collection * fCollection;
public:
 Program();
 Program( Program &pr )
 {
   fCollection = pr.fCollection;
 }
};

Program globalcollection;


{
 // wanna use method
 Program p(globalcollection);
...
 p.addToCollection(...);
}

Другой вопрос, если ты создаешь экземпляр класса только для того, чтобы добавить данные в глобальную коллекцию, то проще изменить концепцию.
Например. В конструкторе проверяешь создана ли коллекция, если нет - создаешь, если да, ничего не делаешь. Указатель на коллекцию разумеется статический.
Дальше нужен статичный метод, который будет возвращать ссылку на коллекцию, с которой можно будет что-то делать или статичный метод который будет добавлять данные в коллекцию по твоим законам Улыбающийся
Мне это видится так.
« Последнее редактирование: Ноябрь 14, 2010, 18:28 от andrew.k » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.