我要做的是创建一个基类,从中派生的任何东西都会自动注册到另一个类,例如:
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()
内的第一行是打印成员的调试行并显示0
和0
。痛苦的&gt;&lt;
答案 0 :(得分:4)
是的,在构建基类时可以很好地定义this
。
需要注意的一点是,在构造函数(或析构函数)中,*this
的类型是当前正在构造的类,不是完全构造的类型对象最终会有。其主要含义是虚函数将根据它们在基类中的定义进行调度,并且调用纯虚函数无效。
当然,调用AddObject
很好,因为它根本没有访问正在构建的对象。我可以看到你的代码出错的唯一方法是,如果你在构造一个对象时从另一个线程调用ProcessAllObjectsInExistence()
- 这将是非常糟糕的,因为没有锁来保护对列表的访问。
答案 1 :(得分:3)
在Base类中引用this
是完全有效的
但是,在Base类中调用虚方法(如果有的话)实际上并不会按照您认为应该的方式工作。