Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: M9yT от Ноябрь 13, 2010, 20:13



Название: Проблема с доступом к члену класса
Отправлено: 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.


Название: Re: Проблема с доступом к члену класса
Отправлено: Nimbus от Ноябрь 13, 2010, 20:48
Синглтон, наверное


Название: Re: Проблема с доступом к члену класса
Отправлено: M9yT от Ноябрь 13, 2010, 20:51
Синглтон, наверное
А поподробнее?


Название: Re: Проблема с доступом к члену класса
Отправлено: lit-uriy от Ноябрь 13, 2010, 21:54
>>Как избежать этого, не используя static.
ни как


Название: Re: Проблема с доступом к члену класса
Отправлено: BlackTass от Ноябрь 14, 2010, 13:57
Ну да, два варианта собственно. Либо делаем его статиком, либо делаем класс Programm синглтоном (http://en.wikipedia.org/wiki/Singleton_pattern)


Название: Re: Проблема с доступом к члену класса
Отправлено: lit-uriy от Ноябрь 14, 2010, 14:09
>>либо делаем класс Programm синглтоном
который внутри содержит переменную статическую и соответствующий статический метод.
статика - единственный вариант в Си++


Название: Re: Проблема с доступом к члену класса
Отправлено: andrew.k от Ноябрь 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(...);
}

Другой вопрос, если ты создаешь экземпляр класса только для того, чтобы добавить данные в глобальную коллекцию, то проще изменить концепцию.
Например. В конструкторе проверяешь создана ли коллекция, если нет - создаешь, если да, ничего не делаешь. Указатель на коллекцию разумеется статический.
Дальше нужен статичный метод, который будет возвращать ссылку на коллекцию, с которой можно будет что-то делать или статичный метод который будет добавлять данные в коллекцию по твоим законам :)
Мне это видится так.