首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >覆盖源文件中的函数

覆盖源文件中的函数
EN

Stack Overflow用户
提问于 2020-10-26 04:28:53
回答 1查看 68关注 0票数 0

我正在构建一个跨平台的应用程序,并且我有:

代码语言:javascript
运行
复制
// Gui.h
class View {
protected:
    virtual void doSomething();
};

class Window : public View {
public:
    void doSomethingElseUnrelated();
};

现在,对于每个平台,我都有自己的Gui.cpp文件。因此,每个平台都有一个Gui.h文件和一个Gui.cpp。

现在在windows平台上,我可以直接调用Window类函数doSomething。然而,在Mac平台上,Window类和ViewdoSomething的实现是不同的。

因此,在Mac平台上,我必须覆盖Window类中的doSomething函数。

这意味着我必须在头文件中添加doSomething Window类覆盖。这将影响所有平台,即使它只在Mac平台上需要。

有没有可能只在Mac平台的Window类中添加doSomething的覆盖?

EN

回答 1

Stack Overflow用户

发布于 2020-10-26 11:38:24

抽象工厂设计模式就是这个问题的解决方案。看看下面类似需求的测试代码:

gui.h:使用所有必需类的声明来头文件。

代码语言:javascript
运行
复制
class drawB // The Abstract Product1 Class(can add similar Abstract Product2 for another actions like mac/windows style screenlock)
{
public:
    virtual void drawButton() = 0;
};

class WindowsStyleButton : public drawB // Product Class 1
{
public:
    virtual void drawButton() override;
};

class MacStyleButton : public drawB // Product Class 2
{
    void drawButton() override;
};

class Gui //Abstract Factory
{
public:
    virtual drawB* createButton() = 0;
};

class WindowsGui : public Gui // Concrete Factory1
{
public:
    drawB* createButton() override;
};

class MacGui : public Gui //Concrete Factory2
{
public:
    drawB* createButton() override;
};

MacGui.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include "GUI.h"

using namespace std;

void MacStyleButton ::drawButton()
{
    cout << "Drawing a Mac style Button! " << endl;
}

drawB* MacGui ::createButton()
{
    return new MacStyleButton;
}

WindowsGui.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include "GUI.h"

using namespace std;

void WindowsStyleButton :: drawButton()
{
    cout << "drawing a Windows style Button! " << endl;
}

drawB* WindowsGui ::createButton()
{
    return new WindowsStyleButton;
}

Main.cpp

代码语言:javascript
运行
复制
/*the Client*/
int main()
    {
    Gui* GuiObject;
    drawB* BtnObject;

#ifdef __APPLE__ //condition check for Mac OS
    GuiObject = new MacGui;
    BtnObject = GuiObject->createButton();
    BtnObject->drawButton();

#elif _WIN32 // Condition check for Windows OS
    GuiObject = new MacGui;
    BtnObject = GuiObject->createButton();
    BtnObject->drawButton();
#else

#endif
return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64528451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档