Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何扩展/组合包含纯虚拟函数的接口类?_C++_Interface_Multiple Inheritance_Bada_Pure Virtual - Fatal编程技术网

C++ 如何扩展/组合包含纯虚拟函数的接口类?

C++ 如何扩展/组合包含纯虚拟函数的接口类?,c++,interface,multiple-inheritance,bada,pure-virtual,C++,Interface,Multiple Inheritance,Bada,Pure Virtual,我正在使用: class ISearchFuncs : public Osp::Ui::IActionEventListener , public Osp::Ui::ITextEventListener , public Osp::Ui::IScrollPanelEventListener { public: virtual result CloseOverlayKeyb() = 0; virtual result InitiateSearch() = 0

我正在使用:

class ISearchFuncs :
    public Osp::Ui::IActionEventListener
    , public Osp::Ui::ITextEventListener
    , public Osp::Ui::IScrollPanelEventListener {
public:
    virtual result CloseOverlayKeyb() = 0;
    virtual result InitiateSearch() = 0;
};
但是,当我尝试通过传递指向ISearchFuncs的指针连接到这些接口时,回调/事件无法运行。然而,在实际实现它们的类中使用这些接口进行连接并没有这样的问题。我可以接受这一点,但如果我能找到这个问题的根源,封装会更好

class Form1 :
    public Osp::Ui::Controls::Form
    , public ISearchFuncs
//  , public Osp::Ui::IActionEventListener// see below
//  , Osp::Ui::ITextEventListener//deleted due to ambiguity
    {
这就是它如何工作的方法:

    EditField *pSearchEditField = new EditField;
    TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(labelRect.x + labelRect.width / 6, labelRect.y, 7 * labelRect.width / 12, 80)
                        , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
    pSearchEditField->AddTextEventListener(*this);
    pSearchEditField->AddScrollPanelEventListener(*this);
    pSearchEditField->AddActionEventListener(*this);
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
            L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
            L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
    __pScrollPanel->AddControl(*pSearchEditField);
然而,传递到另一个类来执行等效操作时,无法在运行时连接事件:

    __pSearchPanel->Construct(labelRect, this, __pScrollPanel);
电话:

result SearchPanel::Construct(const Rectangle &rect, ISearchFuncs *pListener, ScrollPanel *pScrollPare) {
    result r = E_SUCCESS;
    int x1 = rect.width / 6;
    int x2 = rect.width * 3 / 4;
    int y1 = rect.height / 3;

    EditField *pSearchEditField = new EditField;
    TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(rect.x + x1, rect.y, x2 - x1, y1)
            , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
    pSearchEditField->AddTextEventListener(*pListener);
    pSearchEditField->AddScrollPanelEventListener(*pListener);
    pSearchEditField->AddActionEventListener(*pListener);
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
            L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
            L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
    TryCatch(E_SUCCESS == (r = pScrollPare->AddControl(*pSearchEditField)),, "");
很抱歉代码重复,但这让我抓狂

我试图遵循的习惯用法是。

似乎Osp::Ui::IActionEventListener, Osp::Ui::ITextEventListener,以及 Osp::Ui::IScrollPanelEventListener都派生自公共 基础您需要使用虚拟继承来避免公共基 上课


在被迫接受我在问题中概述的黑客攻击之后,由于使用存根IIRC重写方法,我遇到了一些错误


我90%确信这不是引发我问题的反常现象的原因,但100%确信它比pmr的答案更相关。

您需要减少代码,使其比这更不可知框架,并解释什么不起作用。标准C++中没有连接事件。否则很难回答。@pmr:TryCatch是用来检测错误的。很抱歉,这不是标准的C++,因为没有正确的异常处理。在代码中比英文更好地表达,或者我想。我已经涉足了你所使用的任何框架的DOC,并向你展示了我将要做什么,但是这在框架方面不一定是正确的,只是在C++方面。其中的标识符保留在实现中,因此不允许使用它们。除此之外,尽量不要在C++中编写java,你会更快乐。@达蒙:除了MI,这里相当于java接口。这是一个好的观点,但是因为那些基类本身是纯抽象接口,没有具体的成员,所有纯虚拟的,没有不确定性的继承性的风险。已确认,无差异。
class ISearchFuncs :
    public virtual Osp::Ui::IActionEventListener
    , public virtual Osp::Ui::ITextEventListener
    , public virtual Osp::Ui::IScrollPanelEventListener 
{
public:
  virtual result CloseOverlayKeyb() = 0;
  virtual result InitiateSearch() = 0;
};