【发布时间】:2018-08-25 07:39:15
【问题描述】:
我有点困惑。如果您搜索(智能)指针的有用性,您会得到非常不同的意见。 几乎每个人都同意应该使用智能指针而不是普通指针,但也有许多意见认为在现代 C++ 中根本不应该使用指针。
让我们考虑一下这种抽象情况(这与我的问题相似): 你有一个“衣服”类,它有一个“帽子”类型的成员
class Hat {
public:
enum class HatType{
sombrero,
sun hat,
helmet,
beanie,
cowboy_hat
};
// some functions
private:
HatType type;
// some members
}
class Clothes {
public:
// some functions
private:
Hat currentHat;
// some other members of other types
}
如果我将Hat 更改为Hat*(或unique_ptr<Hat>?),运行时间是否有任何差异。
(在Clothes 的许多功能中,您需要从Hat 调用某些东西)
我问的原因是因为有许多不同类型的帽子。
像阔边帽、太阳帽、头盔、无檐小便帽和牛仔帽。现在我的班级帽子有一个存储帽子类型的枚举器。
帽子类型仅与Hat 的一个特定功能相关,但这是最常用的功能。
现在我在这个特定的函数中使用了一个简单的switch case,并且根据帽子类型,函数的评估方式略有不同。这工作得很好,但我认为简单地为每个不同的帽子类型创建一个自己的类会更聪明,这些帽子类型继承自一个主要的 Hat 类并覆盖一个函数。
为此,我想我必须将Clothes 中的成员currentHat 更改为任何类型的指针。我研究了这是否会对我的表现产生任何负面影响(我想可能是因为我的currentHat 对象和我的Clothes 对象在内存中的位置可能相距很远,但我不知道这是否会发生,如果这会对现代编译器产生任何负面影响)。
在我的研究过程中,我经常读到应该避免指针,这让我思考......我发现的一些信息也很旧,我不知道这是否已经过时了。有没有更好的方法来做到这一点?
有人遇到过这种问题吗?在我花很多时间改变我的整个项目之前获得一些反馈会很好......
旁注:我仅以Clothes 和Hats 为例。在我的实际应用程序中,我有不同的类型,我从Clothes 类型创建了数百万个对象,我必须调用Clothes 的函数,这将调用Hat 的函数数百万次,这就是为什么我关心运行时间。
编辑:也许还值得注意的是,到目前为止,我在我的应用程序中完全避免使用指针,主要是因为我在一些书中读到应该尽量避免使用指针:-)
EDIT2:感谢您的所有回答。请注意,我的部分问题不是如何做到这一点(尽管答案在那个阶段非常有用),而是性能是否会因此受到影响。
【问题讨论】:
-
你怎么能不使用指针呢?这可能会杀死多态性
-
错误的抽象。 A
Hatis-aClothes(呃,这是一个糟糕的类名,因为没有单数)。这应该使用推导来建模。关于指针的问题:它们有其用途。它们可以用来描述有 0 个或 1 个实例。它们可用于对共享所有权进行建模。可能还有许多其他用例。 -
在你的情况下
std::variant可能会更好。 -
我不是专业程序员。我用它来做我的科学。因此我之前没有使用过多态性......但我认为开始使用这个方便的工具是个好主意
-
@KillzoneKid:多态性也可以通过引用获得。您不需要 指针来实现多态性。