在我创建跨平台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)
然而,这听起来更像是一个黑客而不是问题的实际解决方案.
该怎么办?我应该完全改变我的设计吗?我的任何可能的解决方案都能保留一点水吗?
假设我有一个Vector3
包含normalize()
方法的类.该方法是否应该返回一个新的Vector3
,或者修改Vector3
它被调用的实例(因此返回对self(Vector3&
)的引用?)有哪些实例优先于另一个?性能怎么样?
所以我正在编写自己的小GUI框架,将Windows API包装在有用的类中.我正在尝试让用户以面向对象的方式处理WndProc的消息,但我遇到了一些障碍.
我有一个Button
继承自抽象Control
类的类,它几乎是Button的HWND句柄的包装器.还有一个Window
类,包含(你知道什么)窗口的句柄.该类还有一个Control
s 容器,负责创建自己的(静态)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) 考虑到一个程序完全由constexpr函数组成(它们都能在编译时计算),对于"level"深度调用constexpr函数的方式是否存在限制?通过仅使用constexpr函数,在给定正确的必要条件的情况下,是否可以在编译时计算整个程序?