对象工厂和这个指针

Object Factory and this Pointer

本文关键字:指针 工厂 对象      更新时间:2023-10-16

我想了解这样一个简单的对象工厂

template <class Base>
class Factory
{
protected:
Factory (std::string name)
...
}
Factory<Base>::Factory (std::string name)
{
        Factory_Map[name] = this;
}
//-------------------------------------
template <class Derived, class Base>
class Factory_Der: public Factory<Base>
{
public:
Factory_Der(std::string name) : Factory<Base>(name) { }
...
};

因此Factory_Der的构造函数将调用Factory的构造函数。但我不知道工厂的构造函数中的这个指针会引用Factory对象或Factory_Der。看起来这个将引用工厂对象,但代码不应该工作!(它正在发挥作用)。

感谢

首先,您创建了一个对象,一个Factory_Der对象,对吗?所以,当你问this指针指向什么对象时,它可以指向什么对象?您只有一个对象——Factory_Der对象。

由于Factory_Der继承自Factory,因此Factory_Der对象的部分存储器布局可以被视为Factory对象。但它是同一对象的一部分。在任何可能指向的位置都没有"单独的"Factory对象。

你似乎陷入了这样一个事实,即这些都是构造函数。但是构造函数的工作方式与方法非常相似,只是它们的特殊之处在于,它们在内存分配后的对象构造过程中被"自动调用"。你可以想象这个对象构造:

Factory_Der *foo = new Factory_Der;

从下面翻译成这样的东西(不是真正的语法;然而Objective-C就是这样做的):

Factory_Der *foo = malloc(sizeof(Factory_Der));
foo->constructor();

这就解释了构造函数中this指向对象的原因。

在每个构造函数的开头,可以指定一个可选的初始值设定项列表,该列表指定如何初始化基类和字段。(如果你跳过某个东西的初始值设定项,就会选择默认值。)所以基本上,构造函数在一开始就自动调用超类的构造函数。

因此,我们可以再次想象您的构造函数:

Factory_Der(std::string name) : Factory<Base>(name) { }

在下面被翻译成这样的东西:

void constructor(std::string name) { this->Factory<Base>::constructor(name); }

因此,您可以看到,派生类的构造函数本质上是将其this"传递"给基类的构造函数。因此,他们从this看到的对象是相同的对象

当然,在基类的构造函数运行时,派生类的状态并没有设置。因此,该对象是否真的可以被视为派生类对象是一个有争议的问题。但是,如果你的问题是Factory的构造函数从this中看到的对象是否就是最终将成为Factory_Der对象的对象,那么答案肯定是肯定的。

您的逻辑问题是,您认为Factory*被限制为指向Factory对象。尽管这样的指针被限制为指向Factory或其任何子类(因为它们是Factorys)。在这种情况下,this指向实际实例化的对象,该对象实际上是Factory_Der类型。你真的应该重读继承,因为在我看来你还没有完全理解它