gpt4 book ai didi

c++ - C++ 中的接口(interface)类和工厂函数

转载 作者:太空狗 更新时间:2023-10-29 19:46:08 26 4
gpt4 key购买 nike

在 Meyers Effective C++ 项目 31(我的第 3 版中的第 147 页)中,他谈到了接口(interface)类。他展示了一个带有纯虚方法和派生类 RealPerson 的 Person 类的示例。它看起来像这样,不过我已经对其进行了简化并添加了一些琐碎的实现。

#include <string>

class Person {
public:
virtual ~Person() {};
virtual std::string name() const = 0;
};

class RealPerson : public Person {
public:
RealPerson(const std::string& name) : theName(name) {}
virtual ~RealPerson() {};
virtual std::string name() const { return theName; }

private:
std::string theName;
};

然后他继续说我们可以轻松地创建一个“工厂功能”来创建真实的人:

std::shared_ptr<Person>Person::create(const std::string& name) // EDIT - removed tr1::
{
return std::shared_ptr<Person>(new RealPerson(name));
}

当我只能以正常方式实例化 RealPerson 类时,为什么我要使用这个“创建”函数?

另外,为什么派生类方法是“虚拟的”。

编辑

感谢您的评论。我了解(现在)的目的,但我看不出它与任何层次结构中的任何基类有何不同 - 这种工厂函数在所有基类中都是典型的吗?它也有一种拼凑的感觉,而不是一种语言的一部分。但我对 C++ 比较陌生,所以这可能只是我的问题。

最佳答案

它用于在您有多个子类时选择正确的子类。

并将该逻辑保留在一个地方以使其可维护(面向对象+程序的家伙!!)

如果你有一个数据库或数据输入屏幕,可以存储或允许多个人输​​入,当你想编写一个函数来读取屏幕以创建新的人对象,或者从中加载记录时数据库,第一行不能是'new RealPerson(name);'。数据输入屏幕或数据库记录可能在谈论“ImaginaryFriend(name)”。在最简单的情况下,这将通过屏幕上的下拉菜单或数据库列中的代码/字符串来提供。

而且你无法创建“新人”——它是虚拟的。

因此,在开始将字段或数据库列加载到新对象之前,您可以通过调用工厂并向其传递“代码”(或其他与对象一致的“赠品”)来创建新对象,在最基本的情况下,工厂将检查(比如通过一个简单的 switch 语句)以确定调用哪个"new"。这样,您的程序就不会乱七八糟地使用 switch 语句来创建正确类型的具体对象。

当然,它可以变得比这更复杂。这只是一种情况,如果您确实使用继承,您在构建正确的子类时必须处理。

关于c++ - C++ 中的接口(interface)类和工厂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154284/

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