gpt4 book ai didi

c++ - CRTP 基本构造函数崩溃,因为未构造子项

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

我有自动生成的类,但我想让最终用户能够添加自定义成员函数和构造函数。

我的方法是使用一个 CRTP 基类,它没有成员变量,只有函数。

问题在于构造函数。如果我在我的 CRTP 中定义构造函数,我将无法正确访问子类,因为它尚未构造,因为子类构造函数仅在构造 CRTP 基类后才被调用。

#include <iostream>
#include <string>

template<class Child>
struct Foo {
Foo(std::string i) {
// Childs constructor is not run yet.
std::cout << static_cast<Child&>(*this).d.size(); // Prints trash
static_cast<Child&>(*this).d = i; // Segfault here
(void) i;
}
};

// Cannot change this class.
struct Bar : Foo<Bar> {
using base_t = Foo<Bar>;
using base_t::base_t;
std::string d;
};


int main()
{
Bar bar("asdgasdgsag");
std::cout << "bar.d: " << bar.d << std::endl;
}

有没有办法解决这个问题?

最佳答案

您的基础构造函数不能对子类做任何事情。完全没有。后者尚未建成。

CRTP 允许 Foo 的其他成员函数这样做,但仅此而已。

在您提出的设计中没有“快速修复”。您可以向 Foo 添加类似 Init 的函数,以便稍后执行此操作(并从 child 的 ctor 调用它),或者(理想情况下)重新考虑您的方法。

这有点奇怪,你不能修改子类,而是向 Base 添加东西——这不是继承应该完成的方式,而且你似乎在尝试使用 CRTP 来解决这个问题,但已经发现为什么这不是有效的黑客攻击。

在不知道您要完成什么的情况下,我不能比这更精确了。

也许工厂函数可以帮到你?或者继承自Bar

关于c++ - CRTP 基本构造函数崩溃,因为未构造子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560546/

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