指向类中对象的指针:push_back和指针冲突
Pointer to object in a class: push_back and pointers conflicts
我对与所示代码结构相似的代码有几个问题。不行!我认为主要问题是push_back函数,我需要其他作用域(我需要在操作过程中构建类向量,并且在单个类内部也有指针)。有人知道如何解决它吗?谢谢
#include <vector>
using namespace std;
class meow {
public:
int b;
meow() {
b = 1;
}
meow(int a) {
b = a;
}
};
class dog {
public:
vector<meow> H;
vector<vector<meow>::iterator> HP;
dog()
: HP(2), H(2) {
HP[0] = H.begin();
HP[1] = H.begin() + 1;
}
};
int main() {
vector<dog> WOOF(1);
WOOF.push_back(dog());
meow ok(2);
(*WOOF[1].HP[0]) = ok;
cout << (*WOOF[0].HP[0]).b << endl;
cout << (*WOOF[1].HP[1]).b << endl;
}
好的,我理解了这笔交易,那么如果我不会在代码中使用 push_back,是否可以做这样的事情?
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
class meow {
public:
int b;
meow() {
b = 1;
}
meow(int a) {
b = a;
}
};
class dog{
public:
vector <meow> H;
vector<vector<meow>::iterator> HP;
dog():
HP(2),H(2){
}
void Referring(){
HP[0]=H.begin();
HP[1]=H.begin()+1;
}
};
int main() {
vector<dog> WOOF(1);
WOOF.push_back(dog());
for(int i=0;i<WOOF.size();++i){
WOOF[i].Referring();
}
meow ok(2);
(*WOOF[1].HP[0]) = ok;
cout << (*WOOF[0].HP[0]).b << endl;
cout << (*WOOF[1].HP[1]).b << endl;
}
在dog::HP
中,您存储指向dog::H
向量元素的迭代器。复制dog
对象时,HP
新对象复制的迭代器仍将指向原始对象的向量H
。当原始对象被销毁时,新对象中的迭代器将不再指向任何有用的内容。
这就是在main()
中发生的情况,其中临时dog
对象被复制到WOOF
中。
此外,一般来说,首先存储迭代器可能不是一个好主意。修改H
后,HP
中的所有迭代器都将失效,并且不再安全使用。
狗类需要一个复制 ctor。这至少是一个致命的问题,随着狗的副本被创建,push_back会导致灾难。默认复制 ctor 将按值复制指针,以便它们指向错误的(旧)地址。增强型狗类:
class dog {
public:
vector<meow> H;
vector<vector<meow>::iterator> HP;
dog() : HP(2), H(2)
{
HP[0] = H.begin();
HP[1] = H.begin() + 1;
}
dog(const dog& rhs) : H(rhs.H),HP(2)
{
HP[0] = H.begin();
HP[1] = H.begin() + 1;
}
dog& operator=(const dog& rhs)
{
if(&rhs==this)
return *this;
H=rhs.H;
HP[0] = H.begin();
HP[1] = H.begin() + 1;
}
};
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- push(ing)back在循环中对象指针