我想做的是创建一个基类,从它派生的任何东西都会自动注册到另一个类,例如:
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()
之前,成员是 0
和 100
,然后是ProcessAllObjectsInExistence()
中的第一行是调试行,它打印成员并显示 0
和 0
。痛苦的><
最佳答案
是的,在构造基类时访问this
是明确定义的。
需要注意的一件事是,在构造函数(或析构函数)期间,*this
的类型是当前正在构造的类,不是完全构建的对象最终将具有。其主要含义是虚函数将根据其在基类中的定义进行调度,调用纯虚函数是无效的。
当然,调用 AddObject
没问题,因为它根本没有访问正在构建的对象。我能看到您的代码出错的唯一方法是,如果您在构造对象时从不同的线程调用 ProcessAllObjectsInExistence()
- 这将非常糟糕,因为没有锁来保护对列表。
关于c++ - 在基类构造函数中使用 `this` 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9290800/