在基类构造函数中使用“this”有效吗
Is it valid to use `this` inside base class constructor?
我要做的是创建一个基类,从中派生的任何东西都将自动注册到另一个类,例如:
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
,成员是0
和100
,然后ProcessAllObjectsInExistence()
内部的第一行是打印成员并显示0
和0
的调试行。痛苦的><
是的,在构造基类时访问this
是很好的定义。
需要注意的一点是,在构造函数(或析构函数)期间,*this
的类型是当前正在构建的类,而不是完全构建的对象最终将具有的类型。这主要意味着虚拟函数将根据它们在基类中的定义进行调度,并且调用纯虚拟函数是无效的。
当然,调用AddObject
是可以的,因为它根本没有访问正在构建的对象。我能看到你的代码出错的唯一方法是,如果你在构建对象时从另一个线程调用ProcessAllObjectsInExistence()
——这将非常糟糕,因为没有锁来保护对列表的访问。
在基类中引用this
是完全有效的
然而,在基类中调用虚拟方法(如果有的话)实际上并不能像您认为的那样工作。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 关于C++中具有多重继承"this"指针的说明
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在noexcept 规范中是否允许使用"this"?
- 在有效C++第 3 项中,为什么使用 static_cast<const TextBlock&>(*this) 而不是 static_cast<const TextBlock>
- 在基类构造函数中使用“this”有效吗