VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: barstear

结构设计的问题,高手请进

[复制链接]

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-9 18:00:01 | 显示全部楼层
如果不想定义太多接口可这样定义:
struct IDeviceEvent
{
    long OnEvent1(int nEventId, void* pSender, void* pParam);
};
CWhat只用继承IDeviceEvent,再通过nEventId等条件判断。

另外不明白你的CWhat是干什么的?
回复

使用道具 举报

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-9 18:45:01 | 显示全部楼层
应该是空实现的虚函数
struct IDeviceEvent
{
virtual long OnEvent1(int nEventId, void* pSender, void* pParam){};
};
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-7-10 09:00:01 | 显示全部楼层
class IDevice        // CWhat 调用设备的抽象借口

class IConnectPoint  // 设备调用CWhat 的接口

class CWhat
{
    static IConnectPoint* RegisterDevice(IDevice *ptr) // 所有的设备对象调用这个函数向 what 注册自己,同时该函数返回 一个与自己交互的接口。(此类可以实现单件模式)
}
回复

使用道具 举报

1

主题

11

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-10 11:15:02 | 显示全部楼层
//是不是这个意思

#include "stdafx.h"

struct IDeviceEvent
{
    typedef enum { EM_DO1 = 0, EM_DO2 };  //Event Id
    virtual long OnEvent1(int nEventId, void* pSender, void* pParam){return 0;};
};

class IDevice
{
public:
    IDevice():m_pEvent(NULL){};
    virtual ~IDevice(){};
    void SetEventHandle(IDeviceEvent* pEvent){m_pEvent=pEvent;};
protected:
    IDeviceEvent* m_pEvent;
};

class CDevice1 : public IDevice
{
public:
    void Do1()
    {
        printf("do1\n");
        if ( NULL != m_pEvent )
            m_pEvent->OnEvent1(IDeviceEvent::EM_DO1, this, NULL);
    };
};

class CDevice2 : public IDevice
{
public:
    void Do2()
    {
        printf("do2\n");
        if ( NULL != m_pEvent )
            m_pEvent->OnEvent1(IDeviceEvent::EM_DO2, this, NULL);
    };
};

class CWhat : public IDeviceEvent
{
public:
    long OnEvent1(int nEventId, void* pSender, void* pParam)
    {
        switch ( nEventId )
        {
        case EM_DO1: printf("Ondo1\n");break;
        case EM_DO2: printf("Ondo2\n");break;
        }
        return 0;
    };
};


int _tmain(int argc, _TCHAR* argv[])
{
    CWhat wh;

    CDevice1 d1;
    d1.SetEventHandle(&wh);

    CDevice2 d2;
    d2.SetEventHandle(&wh);

    d1.Do1();

    d2.Do2();

    return 0;
}
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-10 11:45:01 | 显示全部楼层
还是觉得定一套通用的设备接口比较好,具体对于不同设备的不同操作就要看DEVICE1 、DEVICE2 等内部的封装了。
回复

使用道具 举报

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-7-10 16:15:01 | 显示全部楼层
to:huanwu
呵呵,这种方法实现的是"单向"交互: 即,device调用CWhat.当然在OnEvent1中,能返回去掉device1,
但仅限制在OnEvent1()中, 当CWhat内部时钟触发轮询,要向device要数据时,这种方法就不足了.
这就要在CWhat内部保留一份引用表,时钟一触发就回调各个设备. "双向"就是指这个意思.
但我不很情愿用 "引用表",因为回调每个设备的内容不同,可能device1要调用它的:位置,然后再调用它的速度,最后再取它的状态.而CWhat在调用期间可能要穿插其他的操作来配合device1的返回结果.
所以这种情况决定了无法对所有设备抽出一个IDeviceFace这样的接口,无法实现! 呵呵,也就是说
"引用表"并非是list<> vector<>之类的东西,而是一个个IDevice1* _dev1; IDevice2* _dev2;...
之类的东西.
想像以下,那么多的设备,CWhat中存在那么多的接口指针...,唉,这就是俺"很不情愿"的原因了.
回复

使用道具 举报

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-7-10 18:00:01 | 显示全部楼层
呵呵,大家回复这么快啊..
上面开头回复的是对于 huanwu 的这部分:
struct IDeviceEvent
{
virtual long OnEvent1(int nEventId, void* pSender, void* pParam){};
};

to:raccoon1982
言之有理
回复

使用道具 举报

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-7-10 21:00:01 | 显示全部楼层
to:爱德华德
//class IDevice // CWhat 调用设备的抽象借口
//class IConnectPoint // 设备调用CWhat 的接口
呵呵,包不住啊,要是能包住我就不头痛了.
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-12 10:30:01 | 显示全部楼层
可以到网上找个简单的线程池的例子,如果你仅仅要实现那些功能的话,最简单的线程池就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表