gpt4 book ai didi

c++ - 如何创建抽象类成员?

转载 作者:行者123 更新时间:2023-11-28 05:25:22 27 4
gpt4 key购买 nike

假设我有一个名为 Foo 的类,它不应该被初始化。必须继承才能使用。这使得 Foo 成为一个没有纯虚函数的抽象类。为了示例,我简化了它:

class Foo : Qwe
{
protected:
Bar& bar;
int baz;
Foo(int baz_) : baz(baz_) {}
public:
virtual void function_that_uses_bar() const override
{
// code that uses bar here
}
}

如何使用 Foo 的示例:

class Kappa : public Foo
{
public:
Kappa() : Foo(10)
{
bar = Asd(); // Asd is a Bar
}
}

所以基本上只有从 Foo 派生的类知道应该将 bar 设置为什么。

我得到的错误:Error C2530 'Foo::bar': references must be initialized 引用 Foo 的构造函数。我该如何解决这个问题?

最佳答案

首先,由于您使用的是 C++,因此不存在没有纯虚函数的抽象类。这根本不是一回事。

那么,你的问题是引用必须被初始化。看这段代码:

Bar myBar;
Bar& bar; // Error

bar = myBar; // don't do what you think

在这里,在我评论“错误”的那一行,是因为你不能延迟引用的初始化。引用就像另一个变量的别名。引用必须用一个值初始化。

带有注释“不要按照您的想法行事”的行是因为它不会重新绑定(bind)引用。它将调用函数 Bar::operator=(const Bar&)。它将使 barmyBar 的值。

好的,有了这个解释,就会更容易理解你类出了什么问题。

在你的构造函数中,Foo,有一些隐藏的事情正在发生。

事实上,它会用你在构造函数中得到的值初始化Foo::baz,但它也会初始化你类的其他变量,有点像这样:

//              implicit --v---v
Foo(int baz_) : baz(baz_), bar() {}

看到问题了吗?您正在初始化一个没有要引用的变量的引用。您需要引用要绑定(bind)的变量。

第二个问题,你这里做错了什么:

Kappa() : Foo(10)
{
bar = Asd(); // Asd is a Bar
}

您的意思是 Asd 是扩展 Bar 的类型?如果是这样,您可以将实例 bar 更改为与空 Asd 相同的值。是的,它会将空的Asd 的内容复制到您的bar。这是值(value)语义。用户定义类型的行为就像基础知识一样。


好的,那么现在,如何修复该代码?

我假设您想创建一个基类的新实例,并将对父类的引用绑定(bind)到该新实例。如果是这样,您需要一个可以超出构造函数范围的变量:

Kappa() : Foo(10)
{
Asd myAsd;
bar = /* somehow bind bar to myAsd */

} // myAsd destroyed here!

如您所见,您必须创建一个必须在 } 之后存在的变量。理想情况下,只要 Kappa 还活着,变量就可以存活足够长的时间。输入 std::unique_ptr !

使用 std::unique_ptr 代替不声明所有权的引用。它是一个代表在免费商店上分配的变量的类,又名。堆分配变量。它的行为类似于 java 或 C# 或 <插入托管语言名称> 中的对象。通常将 std::unique_ptrstd::make_unique 一起用于分配。

你可以这样使用它:

class Foo : Qwe
{
protected:
// pointer here, null by default
std::unique_ptr<Bar> bar;

int baz;

Foo(int baz_) : baz(baz_) {}

public:
virtual void function_that_uses_bar() const override
{
// code that uses bar here
}
}

struct Kappa : Foo
{
Kappa() : Foo(10)
{
// Create a new unique_ptr of Asd and bind it to bar
bar = std::make_unique<Asd>(); // Asd is a Bar
}
}

关于c++ - 如何创建抽象类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664324/

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