小编CRe*_*ice的帖子

如何在编译时更改类继承的内容?

在我创建跨平台GUI框架的过程中,我遇到了以下问题:假设我在项目的一般平台无关包含文件夹中有一个中心"Window"类:

//include/window.hpp
class Window
{
    //Public interface
}
Run Code Online (Sandbox Code Playgroud)

然后我有几个依赖于平台的实现类,如下所示:

//src/{platform}/window.hpp
class WinWindow {...}; //Windows
class OSXWindow {...}; //OSX
class X11Window {...}; //Unix
Run Code Online (Sandbox Code Playgroud)

最后,还有原始的Window类'.cpp文件,我希望将实现类"绑定"到通用类.纯粹在概念上,这是我希望能够做到的:

//src/window.cpp
//Suppose we're on Windows

#include "include/window.hpp"
#include "src/win/window.hpp"
class Window : private WinWindow; //Redefine Window's inheritance
Run Code Online (Sandbox Code Playgroud)

我知道这绝不是有效的C++,这就是重点.我想到了解决这个问题的两种可能的方法,我两者都有问题.

pImpl风格的实现

Make Window保存指向实现类的void指针,并将其分配给每个平台的不同窗口类.但是,每次我想要执行平台相关操作时,我都必须向上转换指针,更不用说在任何地方都包含平台相关文件.

预处理程序指令

class Window :
#ifdef WIN32
private WinWindow
#else ifdef X11
private X11Window //etc.
Run Code Online (Sandbox Code Playgroud)

然而,这听起来更像是一个黑客而不是问题的实际解决方案.

该怎么办?我应该完全改变我的设计吗?我的任何可能的解决方案都能保留一点水吗?

c++

9
推荐指数
2
解决办法
284
查看次数

为什么方法应该返回一个新实例,而不是修改实例本身?

假设我有一个Vector3包含normalize()方法的类.该方法是否应该返回一个新的Vector3,或者修改Vector3它被调用的实例(因此返回对self(Vector3&)的引用?)有哪些实例优先于另一个?性能怎么样?

c++ oop

3
推荐指数
1
解决办法
65
查看次数

如何从WndProc的参数中检索消息发送对象?

所以我正在编写自己的小GUI框架,将Windows API包装在有用的类中.我正在尝试让用户以面向对象的方式处理WndProc的消息,但我遇到了一些障碍.

我有一个Button继承自抽象Control类的类,它几乎是Button的HWND句柄的包装器.还有一个Window类,包含(你知道什么)窗口的句柄.该类还有一个Controls 容器,负责创建自己的(静态)WndProc方法.

我要做的是在包含窗口的WndProc中有一个大的switch语句,它基于函数的wParam和lParam参数调用适当的发送控件的处理函数.我看到大多数人做的事情是这样的:

#define MY_BUTTON 101 //Define button's ID

Button::Button()
{
    hwndButton= CreateWindow(
        "BUTTON", text,
        WS_VISIBLE | WS_CHILD,
        position.x, position.y,
        size.x, size.y,
        parent_handle,
        (HMENU)MY_BUTTON,
        GetModuleHandle(NULL),
        NULL);
}
Button* button = new Button();

//Later on, in the Window class...

LRESULT CALLBACK Window::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch((LOWORD)wParam)
    {
    case MY_BUTTON:
        button->HandleMessage(&msg);
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不希望用户为它们创建的每个对象实例分配唯一的整数.相反,因为我有一个控件容器,我宁愿做这样的事情:

//In the Window Class...
Button* button = new Button();
AddControl(button);

static LRESULT …
Run Code Online (Sandbox Code Playgroud)

c++ winapi

2
推荐指数
2
解决办法
423
查看次数

constexpr表达式的嵌套程度如何?

考虑到一个程序完全由constexpr函数组成(它们都能在编译时计算),对于"level"深度调用constexpr函数的方式是否存在限制?通过仅使用constexpr函数,在给定正确的必要条件的情况下,是否可以在编译时计算整个程序?

c++ constexpr

1
推荐指数
1
解决办法
72
查看次数

标签 统计

c++ ×4

constexpr ×1

oop ×1

winapi ×1