在基类构造函数中使用“this”有效吗

Is it valid to use `this` inside base class constructor?

本文关键字:this 有效 基类 构造函数      更新时间:2023-10-16

我要做的是创建一个基类,从中派生的任何东西都将自动注册到另一个类,例如:

class System;
class Object
{
public:
    Object()
    {
        System sys;
        sys.AddObject(this);
    }
    virtual ~Object()
    {
        System sys;
        sys.RemoveObject(this);
    }
};
class System
{
public:
    // Some other processing function which operates on all things derived
    // from Object at one time.
    void ProcessAllObjectsInExistence();
    void AddObject(Object *o)
    {
        list.push_back(o);
    }
    void RemoveObject(Object *o)
    {
        std::vector<Object *>::iterator i = find(list.begin(), list.end(), o);
        if (*i != list.end()) list.erase(i);
    }
private:
    static std::vector<Object *> list;
};

这是合法的和明确的吗?我之所以这么问,是因为在从ProcessAllObjectsInExistence()内部读取和写入Object(此处未显示)的数据成员后,我遇到了一些有趣的错误。

即,对于在我调用System.ProcessAllObjectsInExistence()之前的单个Object,成员是0100,然后ProcessAllObjectsInExistence()内部的第一行是打印成员并显示00的调试行。痛苦的><

是的,在构造基类时访问this是很好的定义。

需要注意的一点是,在构造函数(或析构函数)期间,*this的类型是当前正在构建的类,而不是完全构建的对象最终将具有的类型。这主要意味着虚拟函数将根据它们在基类中的定义进行调度,并且调用纯虚拟函数是无效的。

当然,调用AddObject是可以的,因为它根本没有访问正在构建的对象。我能看到你的代码出错的唯一方法是,如果你在构建对象时从另一个线程调用ProcessAllObjectsInExistence()——这将非常糟糕,因为没有锁来保护对列表的访问。

在基类中引用this是完全有效的
然而,在基类中调用虚拟方法(如果有的话)实际上并不能像您认为的那样工作。