gpt4 book ai didi

c++ - 从基类方法返回对派生类的引用

转载 作者:太空狗 更新时间:2023-10-29 20:01:37 27 4
gpt4 key购买 nike

我的任务是实现一个简单的 SVG 生成器。我需要支持 Circle、Polyline 和 Text。这三者至少有 4 个共同的方法:- 设置描边颜色- 设置填充颜色- 设置描边宽度- 到字符串主要要求之一是支持链接,例如:折线{}.SetStrokeColor("白色").SetFillColor("黑色")...

我决定实现一个基类 Element,所有其他类都继承自该基类。这个想法是有一个类 Document 来保存添加到文档中的所有元素的 vector 。基本方法的示例签名:

// source of trouble
Element &SetStrokeColor(const Color &color) {
...
return *this;
}

我的派生类确实调用了这些方法,但问题是这些方法返回对基类 Element 的引用,而不是派生类。

我的问题是是否可以一起用c++实现???

Further discussion here

最佳答案

如果您想共享实现保留类型信息,CRTP 就是您所需要的:

struct ElementBase { };

template <class Concrete>
struct Element : ElementBase {

Concrete &setStrokeWidth(int width) {
// Actual implementation...
(void) width;

return cthis();
}

private:
friend Concrete;
Element() = default;

Concrete &cthis() { return static_cast<Concrete &>(*this); }
Concrete &cthis() const { return static_cast<Concrete const &>(*this); }
};

struct Circle : Element<Circle> {
Circle &SetCircleCenter(int x, int y) {
// Actual implementation...
(void) x;
(void) y;

return *this;
}
};

int main() {
Circle c;
c.setStrokeWidth(4).SetCircleCenter(0, 0);
}

See it live on Wandbox

关于c++ - 从基类方法返回对派生类的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423269/

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