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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Передача данных  (Прочитано 11362 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #15 : Февраль 16, 2011, 17:11 »

libsig++ Хороший вариант

Если нехочется прикручивать всю библиотеку то можно сделать так:

Код
C++ (Qt)
#include <iostream>
 
using namespace std;
 
 
template <class T, typename U>
class Signal
{
public:
   Signal() {
       _obj = 0;
       _slot = 0;
   }
   void operator()(const U& val) {
       if (_obj) {
           (_obj->*_slot)(val);
       }
   }
   void connect(T *obj, void (T::*slot)(const U &)) {
       _obj = obj;
       _slot = slot;
   }
 
private:
   T *_obj;
   void (T::*_slot)(const U &);
};
 
 
template<class T>
class Sender
{
public:
   Sender(){}
   Signal<T, int> signal;
   void run() {
       signal(123);
   }
};
 
class Receiver
{
public:
   Receiver() {}
   void slot(const int &x) {
       cout << x << endl;
   }
};
 
int main()
{
   Sender<Receiver> sender;
   Receiver receiver;
   sender.signal.connect(&receiver, &Receiver::slot);
 
   sender.run();
 
   return 0;
}
 
 
Это фактически сильно упрощённая схема сигнал-слот, реализованая в libsig++
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
deaks
Гость
« Ответ #16 : Февраль 16, 2011, 17:45 »

да не, я же говорю все планирую делать через Object. У его интерфейсов можно вызывать функции getData, - что-то типа того, которые возвращают данные объекта в зависимости от параметра, который указывает на этот объект.
У меня сейчас именно так и реализовано, но при этом все данные классов зашиты в структуры, которые друг от друга наследуются. Но тут возникает неприятный момент - в самом классе, в котором описана структура переменных, приходится ведь работать через данную структуру(ахинея какая-та получается), напрямую в переменную уже не запишешь. Код состоит сплошь из имен структуры. В общем все это как-то криво выглядит  - примерно так:
Код:
	airData._Va = airData._V = airData.V.Length();

if(airData._Va < 0.5)
airData._Va = 0.5;

airData.betaR = asin(airData.V.z/ airData._Va);

if(fabs(airData.V.y) < 0.01 && fabs(airData.V.x) < 0.01)
airData.alphaR = 0.;
else
airData.alphaR = atan2(airData.-V.y, airData.V.x);

airData.alpha = airData.alphaR * M_C57;
airData.beta = airData.betaR * M_C57;
« Последнее редактирование: Февраль 16, 2011, 17:49 от deaks » Записан
ruzik
Гость
« Ответ #17 : Февраль 16, 2011, 18:32 »

Может я не правильно что-то понял, но почему бы не сделать один абстрактный класс, со статической функцией, а классы А и Б просто унаследовать от этого класса, ну а когда в классе А изменяется переменная, вызывать эту функцию
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #18 : Февраль 16, 2011, 18:50 »

Вся проблема, как я понял, в синтаксическом удобстве. Нет?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ruzik
Гость
« Ответ #19 : Февраль 16, 2011, 20:16 »

Вся проблема, как я понял, в синтаксическом удобстве. Нет?
Я думаю под "изящным вариантом" автор подразумевает наиболее быстрый и легкий способ, так что можно сказать-да, в синтаксическом удобстве
Записан
deaks
Гость
« Ответ #20 : Февраль 16, 2011, 21:36 »

именно так, товарищи) синтаксическое удобство
Записан
ruzik
Гость
« Ответ #21 : Февраль 16, 2011, 21:47 »

Ну тогда я думаю что это самое простое и быстрое решение
Код:
почему бы не сделать один абстрактный класс, со статической функцией, а классы А и Б просто унаследовать от этого класса, ну а когда в классе А изменяется переменная, вызывать эту функцию
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #22 : Февраль 16, 2011, 21:56 »

Цитировать
Может я не правильно что-то понял, но почему бы не сделать один абстрактный класс, со статической функцией, а классы А и Б просто унаследовать от этого класса, ну а когда в классе А изменяется переменная, вызывать эту функцию
Я что то не улавливаю причинно-следственную связь..  Непонимающий Видимо уже не соображаю под вечер))
« Последнее редактирование: Февраль 16, 2011, 21:58 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ruzik
Гость
« Ответ #23 : Февраль 16, 2011, 22:08 »

Постараюсь объяснить как смогу:
Код:
class A
{
public:
static void qwerty();
vitrual void doIt();
}
void A::qwerty()
{
void doIt();
}
class B : public A
{
private:
 int a;
public:
int set_a(int ab);
}
int B::set_a(int ab)
{
a=ab;
qwerty();
}
class C : public A
{
void doIt();
}
void C::doIt()
{
IamDoIt(); //это то что надо сделать
}
Вроде должно работать, хотя и не факт  Смеющийся
класс А-это "папа"
B и С -наследуемые
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #24 : Февраль 16, 2011, 22:21 »

Боюсь это работать не будет.
Статические функции класса могут юзать только статические переменные и статические же функции.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ruzik
Гость
« Ответ #25 : Февраль 16, 2011, 22:26 »

Не знал Грустный
Записан
trot
Гость
« Ответ #26 : Февраль 16, 2011, 23:01 »

Типичный случай патерна "Подписчик-издатель".
Примерно следующая схема.
Объекта класса А изменяет какую-то переменную, после этого он посылает сигнал оповещения, о том что значение переменной изменилось. Те объекты, которые следят за изменением этой переменной должны подписаться на получение оповещение.
Я реализовал у себя следующим образом.
1. Создал класс С (по сути это интерфейс), который будет заниматься оповещением своих подписчиков.
Код:
class С 
{

public:
С();
~Сe();

void addObserver(Observer *); //добавляет слушателя
void notifyObservers(Observer * = 0); //оповещает слушателей, параметром является тот объект, который вызвал оповещение            //этот параметр нужен для того, чтобы не запускать update самого себя
private:
QList<Observer *> * m_listObserver; //хранилище слушателей

};
void Observable::addObserver(Observer * o){
if(!m_listObserver->contains(o))
m_listObserver->append(o);
}

void Observable::notifyObservers(Observer * o){
for(int i=0; i<m_listObserver->count(); i++){
if(o!=m_listObserver->at(i))
m_listObserver->at(i)->update(this);
}
}
2. Создаем класс А (тот класс, который меняет переменную) наследуемый от класса (интерфейса) С.
3. Создаем интерфейс D с виртуальным методом update.
4. Создаем класс В (тот класс, который следит за изменением переменной) наследуемый от интерфейса В.
5. Далее связываем издателя с подписчиком, т.е. вызываем метод addObserver с параметром интерфейса С.
6. Когда объекта класса А (издатель) меняет переменную, то он выполняет метод notifyObservers, который переберает всех подписчиков и выполняет их интерфейсный метод update ().
Примерно так. Это я подсмотрел, как данный патерн реализован в стандартной библиотеки java.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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