在基类构造函数中使用`this`是否有效?

时间:2012-02-15 09:28:45

标签: c++ inheritance

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

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;
};

这是合法的吗?我之所以要问的原因是因为我在Object内部ProcessAllObjectsInExistence()(此处未显示)的数据成员阅读和写入后出现了一些有趣的错误。

即。在我调用Object成员System.ProcessAllObjectsInExistence()0之前单个100,然后ProcessAllObjectsInExistence()内的第一行是打印成员的调试行并显示00。痛苦的&gt;&lt;

2 个答案:

答案 0 :(得分:4)

是的,在构建基类时可以很好地定义this

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

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

答案 1 :(得分:3)

在Base类中引用this是完全有效的 但是,在Base类中调用虚方法(如果有的话)实际上并不会按照您认为应该的方式工作。