Что кроме friendly class можно придумать?
От: a1ien.n3t  
Дата: 10.07.13 10:38
Оценка:
Собственно есть некоторое устройство, через которое передаются данны(само устройство тоже принемает данные).
Хотелось бы иметь следующую возможность.


SomeDevice device;

Sender  *sender = device.MakeSender(SomeID);

send->send(data);



Класс Sender можно создавать только в SomeDevice.

Пока как вариант вижу сделать у Sender приватный конструктор, а SomeDevice сделать дружественным к Sender, тоже надо делать дружественным и SomeDevice так-как нужен доступ из Sender к приватным полям.

Или вот такое использование

device.SendTo(SomeID)->send(data); Только вот это сделать.

Да и device.SendTo(SomeID,data) неподходит, так как у Sender и SomeDevice будет много функции(некоторые будут похожи) и будет просто свалка всего в одном классе.
Re: Что кроме friendly class можно придумать?
От: UA Украина  
Дата: 10.07.13 17:37
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

virtual уже отменили?
Re[2]: Что кроме friendly class можно придумать?
От: a1ien.n3t  
Дата: 10.07.13 20:28
Оценка:
Здравствуйте, UA, Вы писали:

UA>Здравствуйте, a1ien.n3t, Вы писали:


UA>virtual уже отменили?


И чем нам тут это поможет. Нам надо грубо говоря разделить один класс на 2 притом чтобы возможности доступа ко второму была через первый(Либо путем создания, либо еще как-нибудь).
Re: Что кроме friendly class можно придумать?
От: __kot2  
Дата: 10.07.13 22:16
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:
AN>Собственно есть некоторое устройство, через которое передаются данны(само устройство тоже принемает данные).
AN>Хотелось бы иметь следующую возможность.
AN>
AN>SomeDevice device;
AN>Sender  *sender = device.MakeSender(SomeID);
send->>send(data);
AN>

суть кода непонятна. зачем нужен Sender? с какой целью?
в простейшей реализации есть контроллер девайсов, который позволяет что-то этим девайсам отправлять
Re: Что кроме friendly class можно придумать?
От: novitk США  
Дата: 10.07.13 23:35
Оценка: 2 (1)
Здравствуйте, a1ien.n3t, Вы писали:

Чем обычная фабрика не подходит? Сделай Sender абстрактным (ака интерфейсом). Соответственно SomeDevice создаст какую-то SenderImpl скрытую в его недрах.
Re[3]: Что кроме friendly class можно придумать?
От: UA Украина  
Дата: 11.07.13 06:08
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>И чем нам тут это поможет. Нам надо грубо говоря разделить один класс на 2 притом чтобы возможности доступа ко второму была через первый(Либо путем создания, либо еще как-нибудь).

Зачем делить? Возвращай базовый который имеет virtual send
Re: Что кроме friendly class можно придумать?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 11.07.13 06:45
Оценка: 2 (1)
Здравствуйте, a1ien.n3t, Вы писали:

AN>Пока как вариант вижу сделать у Sender приватный конструктор, а SomeDevice сделать дружественным к Sender, тоже надо делать дружественным и SomeDevice так-как нужен доступ из Sender к приватным полям.

Сделать Sender чистым интерфейсом и реализовывать его в SomeDevice. Мотивация: слишком сильная связанность Sender и SomeDevice. Если не хочешь делать интерфейс открытым, то можно использовать подход "грань", сделать интерфейс защищённым и определить оператор преобразования, хотя толку от такого в жанном случаее мало.
Ну а вообще, попробуй просто разобраться что должен делать/хранить sender, а что some device. Может стоит подумать про использование потоков ввода/вывода из stl.
Sic luceat lux!
Re: Что кроме friendly class можно придумать?
От: PM  
Дата: 11.07.13 06:57
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>Собственно есть некоторое устройство, через которое передаются данны(само устройство тоже принемает данные).

AN>Хотелось бы иметь следующую возможность.

[код убран]

Я бы перед реализацией подумал сначала об архитектуре: кто за что отвечает и как объекты взаимодействуют между собой. Обычно взаимодействие с устройствами идет по некоторому протоколу, в режиме запрос-ответ.

Из собственного опыта могу посоветовать такую схему:


Пример взаимодействия:
typedef std::vector<unsigned char> buffer;

class Link
{
public:
    virtual ~Link() {}
    virtual buffer read_bytes() = 0;
    virtual void write_bytes(buffer const& bytes) = 0;
};

class Protocol
{
public:
   explicit Protocol(Link& link) : link_(link) {}

   unsigned read_register(unsigned number);

   void read_memory(unsigned mem_address, void* buffer, size_t size);
   {
        buffer request = make_read_request(mem_address);
        link_.write_bytes(request);
        buffer response = link.read_bytes();
        //decode response, put payload in buffer
   }

   void write_memory(unsigned device_address, buffer const& buf);

private:
   Link& link_;
};

class Device
{
public:
   explicit Device(Protocol& protocol) : protocol_(protocol) {}

   void send_value(float v)
   {
       protocol_.write_memory(0x123, v);
   }

   std::vector<char> recieve_status()
   {
      size_t status_size = protocol_.read_register(STATUS_SIZE_REGISTER);
      std::vector<char> status(status_size);
      protocol_.read_memory(STATUS_DATA, status);
   }
};

std::unique_ptr<Link> link = make_serial_link("COM1", 38400, ONE_STOP_BIT, NO_PARITY);
//std::unique_ptr<Link> link = make_tcp_link("192.168.0.99");

Protocol protocol(*link); // тоже может создаваться фабрикой
Device device(protocol);

device.send_value(0.5);
device.recieve_status();
Re[2]: Что кроме friendly class можно придумать?
От: a1ien.n3t  
Дата: 11.07.13 11:44
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, a1ien.n3t, Вы писали:


AN>>Пока как вариант вижу сделать у Sender приватный конструктор, а SomeDevice сделать дружественным к Sender, тоже надо делать дружественным и SomeDevice так-как нужен доступ из Sender к приватным полям.

K>Сделать Sender чистым интерфейсом и реализовывать его в SomeDevice. Мотивация: слишком сильная связанность Sender и SomeDevice. Если не хочешь делать интерфейс открытым, то можно использовать подход "грань", сделать интерфейс ...

ММ идея неплохая спасибо.
Re[3]: Что кроме friendly class можно придумать?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 11.07.13 13:14
Оценка:
Здравствуйте, a1ien.n3t, Вы писали:

AN>ММ идея неплохая спасибо.

Взята из книги Джеффа Элджера "C++ For Real Programmers" если что.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.