gpt4 book ai didi

C++:混入和多态性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:43 25 4
gpt4 key购买 nike

我正在尝试使 Mixin 模式适合我的问题,但我有一个多态性问题,我不知道如何有效解决。在尝试重新设计我的程序之前,我想征求您的意见(也许有一些我不知道的很酷的 C++ 功能)。

我想以非常直接和简单的方式展示它,所以这里的用例可能没有意义。

我只有一个 Window

struct WindowCreateInfo {
std::string title;
int x, y;
int width, height;
};

class Window {
public:
Window(const WindowCreateInfo &createInfo) :
title(createInfo.title),
x(createInfo.x),
y(createInfo.y),
width(createInfo.width),
height(createInfo.height) {}

const std::string &getTitle() const { return title; }

int getX() const { return x; }

int getY() const { return y; }

int getWidth() const { return width; }

int getHeight() const { return height; }

public:
protected:
std::string title;
int x, y;
int width, height;
};

然后我定义了两个mixins ResizableMovable如下

template<class Base>
class Resizable : public Base {
public:
Resizable(const WindowCreateInfo &createInfo) : Base(createInfo) {}

void resize(int width, int height) {
Base::width = width;
Base::height = height;
}
};

template<class Base>
class Movable : public Base {
public:
Movable(const WindowCreateInfo &createInfo) : Base(createInfo) {}

void move(int x, int y) {
Base::x = x;
Base::y = y;
}
};

接下来,我有一些业务层,我在其中处理 Window 的实例。

class WindowManager {
public:
static void resize(Resizable<Window> &window, int width, int height) {
window.resize(width, height);

// any other logic like logging, ...
}

static void move(Movable<Window> &window, int x, int y) {
window.move(x, y);

// any other logic like logging, ...
}
};

这里明显的问题是下面的不编译

using MyWindow = Movable<Resizable<Window>>;

int main() {
MyWindow window({"Title", 0, 0, 640, 480});

WindowManager::resize(window, 800, 600);

// Non-cost lvalue reference to type Movable<Window> cannot bind
// to a value of unrelated type Movable<Resizable<Window>>
WindowManager::move(window, 100, 100);
};

我知道 Movable<Window> 之间存在差异和 Movable<Resizable<Window>>因为后者Movable可以使用 Resizable .在我的设计中,混入是独立的,它们混入的顺序无关紧要。我想这种 mixin 的使用很常见。

有没有什么方法可以让这段代码编译,同时尽可能保持设计?

最佳答案

Is there any way how to make this code compile while keeping the design as much as possible?

您可以简单地让窗口管理器接受任意版本的Resizable<>。和 Movable<>通过模板化方法:

class WindowManager {
public:
template<typename Base>
static void resize(Resizable<Base> &window, int width, int height) {
window.resize(width, height);

// any other logic like logging, ...
}

template<typename Base>
static void move(Movable<Base> &window, int x, int y) {
window.move(x, y);

// any other logic like logging, ...
}
};

关于C++:混入和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53659840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com