LINUX.ORG.RU

Стирают старое и переписывают сначала (это называется дизайнер - мUдак) :) Откуда такие противоестветственные желания?

phoenix ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

int main(...){
struct MyData;
...
}

MyForm::Click(QPoint *point){

MyData->money...
}

Что-то вроде этого. В ф-и main объявил структуру или класс. Человек нажал кнопку - что-то из данных куда-то записалось.

Ty3uK
() автор топика
Ответ на: комментарий от vsl

А как надо? Где надо хранить данные.
Глобальной переменной нельзя - ООП. Остается а main, и в свои ф-и передаю указатели.

Расскажите как надо, как в слоты передавать...

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

Это с какого это перепугу ООП исключает использование глобальных переменных, а?

aa5779
()

Если сильно хочется хранить объект в main, то можно так, например:


struct MyData {
  int a;
};


class MyForm {
  public:
    MyForm(MyData &ref) :d(ref)   {}
    Click(int x, int y)           {d.a = x;}

  private:
    MyData &d;
};


int main() {
  MyData d;
  d.a = 0;
  printf("До клика: %u\n", d.a);

  MyForm f(d);
  f.Click(1, 2);
  printf("После клика: %u\n", d.a);

  return 0;
}


ЗЫ: а почему бы тебе не хранить объект прямо в MyForm, если ты его
только там и юзаешь?

nobody ★★
()
Ответ на: комментарий от nobody

В данной программе прокатит.
Но как быть, если программа большая, много форм.
Доступ должен быть у каждой...

Может есть доки по организации хранения данных?

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

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

Ладно, не критично.
Но почитать что-то надо. А то чуствую что не красиво это.

Ty3uK
() автор топика
Ответ на: комментарий от Ty3uK

> int main(...){
> struct MyData;
> ...
> }
>
> MyForm::Click(QPoint *point){
>
> MyData->money...
> }
>
> Что-то вроде этого. В ф-и main объявил структуру или класс. Человек
> нажал кнопку - что-то из данных куда-то записалось.


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

А вообще в цивилизованных странах за такое убивают. Иди читай книги по
object-oriented design и не морочь людям голову.

int19h ★★★★
()
Ответ на: комментарий от Ty3uK

> Но как быть, если программа большая, много форм. Доступ должен быть у каждой...

Есть, например, такой хитрый прием. Называется "создай себе геморрой сам". Суть его в следующем. В классе, к которому должен быть доступ из кучи других, переопределяешь операторы new и delete. Каждая функция, желающая получить доступ к его экземпляру, создает его с помощью new. Егошный (переопределенный) оператор new (работающий в согласии с конструктором) создает только один (первый) объект, а для всех остальных инкрементирует refcnt, возвращая все тот же (первый, он же единственный) объект. Аналогично, деструктор класса декрементирует счетчик ссылок на объект, и при его обнулении operator delete освобождает память.

Т.е. в программе существует только один экземпляр данного класса. И все функции работают именно с ним. При этом ни одной из них не требуется передавать ссылку на него. Она сама получает его с помощью new.

nobody ★★
()
Ответ на: комментарий от Ty3uK

> А как надо? Где надо хранить данные.
> Глобальной переменной нельзя - ООП. Остается а main, и в свои ф-и
> передаю указатели.

Не глобальные переменные нельзя, а глобальные данные _вообще_. Какая
разница, в main они у тебя или нет?

Еще раз: найди и почитай _хорошие_ книги по объектно-ориентированному
дизайну, и в частности по разделению представления и кода.

int19h ★★★★
()
Ответ на: комментарий от nobody

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

Нет, этот "хитрый прием" называется "синглтон", и является одним из
базовых паттернов ОО-дизайна.

Только вот перегружать операторы new и delete для этого - это полнейший
идиотизм. Достаточно сделать конструктор приватным, а для создания
использовать static factory method в том же классе.

int19h ★★★★
()
Ответ на: комментарий от int19h

> Только вот перегружать операторы new и delete для этого - это полнейший идиотизм. Достаточно сделать конструктор приватным, а для создания использовать static factory method в том же классе.

А нафига, собственно, козе баян? Твой "static factory method" -- и есть operator new, только названный по-другому. То бишь лишняя сущность, затрудняющая понимание и сопровождение, и не дающая ничего взамен.

nobody ★★
()
Ответ на: комментарий от int19h

> Не глобальные переменные нельзя, а глобальные данные _вообще_.

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

nobody ★★
()
Ответ на: комментарий от int19h

синглтон это одно, а предложенная перезагрузка new и delete - это другое (причём бред)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.