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

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

这是否合法且已定义?我问的原因是因为在从 ProcessAllObjectsInExistence() 内部读取和写入 Object 的数据成员(此处未显示)后,我遇到了一些有趣的错误。

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

最佳答案

是的,在构造基类时访问this是明确定义的。

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

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

关于c++ - 在基类构造函数中使用 `this` 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9290800/

相关文章:

c++ - 递增迭代器以指向另一个迭代器的下一个元素

java - 从父类(super class)调用子类方法

php - twig - 将函数传递给模板

c++ - 在 C++ 中的 += 运算符函数内调用 Operator+ 函数

c++ - 等同于 CTypedPtrList 的标准 C++

c++ - wxwidgets 与 gtkmm 符合我的要求

C++删除指针

c# - 如何防止 Visual Studio 在继承的控件中设置我的默认字体大小

java - 一个子类的对象可以访问另一个子类的另一个对象的 protected 字段吗?

javascript - 一种客观的方法来衡量 JavaScript 中不同继承模式的内存/速度?