对象工厂和这个指针

时间:2012-08-19 21:56:22

标签: c++ this factory

我希望像这样了解一个简单的对象工厂

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 对象。似乎这个会引用工厂对象,但代码应该不起作用! (它正在运作)。

由于

2 个答案:

答案 0 :(得分:3)

首先,你创建了一个对象,一个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对象的对象,那么答案肯定是肯定的。

答案 1 :(得分:0)

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