C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
C++ - non-static void* member pointing to another non-static member of different objects having same address but distinct value
这个问题的标题不清楚,有点破。我尝试使用一个成员void*
来存储另一个成员的地址。我不小心发现了一个奇怪的问题。在vector<T>
内创建了三个Object
对象。但是当我查看这三个val_addr
的值时,它们总是指向相同的地址,但显然每个val
总是唯一的。
class Object {
protected:
int val {0};
void *val_addr = nullptr;
std::vector<Object> objs;
public:
Object() = default;
Object(int val)
{
this->val = val;
this->val_addr = (void *) &this->val;
std::cout << "val_addr: " << val_addr << "n"; // always 0X123456 for example
}
std::vector<Object>& get_objs()
{
return objs;
}
};
class Iterable : public Object {
public:
Iterable(const std::set<int>& values) { // {1, 2, 3} inside values
for (const auto & c : values) {
this->objs.emplace_back(c);
}
};
};
任何指向对象成员的指针在矢量扩展后都将失效。在放置新的矢量元素并扩展矢量后,您在对象构造函数中看到的地址无效。因此,您在创建对象时看到了地址,当您查看另一个对象中成员的地址时,以前的地址无效,可能无法进行比较。复制前面的对象并更改&this->val
但this->val_addr
仍包含旧的无效地址。您应该更新复制构造函数中的this->val_addr
。
class Object {
protected:
int val {0};
int *val_addr = nullptr;
public:
Object() = default;
Object(int val)
{
this->val = val;
this->val_addr = &this->val;
std::cout << "val_addr: " << val_addr << "n";
}
Object(const Object& obj)
{
this->val = obj->val;
this->val_addr = &this->val;
std::cout << "new val_addr: " << val_addr << "n";
}
std::vector<Object> &get_objs() const
{
return objs;
}
};
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- 错误:ISO C 禁止采用不合格或括号的非静态成员函数的地址,以形成指向成员函数的指针
- 为什么不允许非静态成员的地址作为模板非类型参数
- 类中静态成员的地址
- 获取静态成员的地址
- 如何获取在QtConcurrent中使用的非静态成员函数的地址