有没有办法检查 STL 容器是否已经使用了 std::move?
我有两种类型的类(假设为 A 和 B),它们在其内部容器中保留另一个类的实例。如果 A 的实例在其容器中保留 B 的实例,则该 B 的实例也必须在其容器中保留相同的 A 实例。
A 可以看到 B 的私有方法(B 将其作为友元),但我必须在 B 上实现移动构造函数。由于 B 可以看到两个类的内部容器,因此我已经实现了 B 来执行两个类的所有添加和删除操作。
问题是:
我必须为 A 实现移动构造函数,并在该容器上使用 stl::move。将容器移动到新的 A 实例后,通知旧类分离的唯一方法是通过使用 B 的方法,旧 A 的容器并对两个类进行删除。
有没有办法让 B 知道旧 A 的容器已被移动,不能访问它?
没有检查也可以工作,但由于类在 std::move 后没有定义状态,所以不应调用 ::remove()(教授说这是错误的)。
请注意:这是我的家庭作业问题,因此我不希望获得解决完整问题的非法帮助,只需要检查对象的一致性部分以跳过调用其函数。
编辑:添加示例。
重要:
1)我需要使用 std::move。我已经知道使用迭代器在 while 循环中完成所有操作的简单方法。但是,明确要求使用 std::move。
2)此代码片段是为了理解我的问题。作为学生,我想自己解决它,我只需要了解如何在不允许时跳过执行一行即可。
我有两种类型的类(假设为 A 和 B),它们在其内部容器中保留另一个类的实例。如果 A 的实例在其容器中保留 B 的实例,则该 B 的实例也必须在其容器中保留相同的 A 实例。
A 可以看到 B 的私有方法(B 将其作为友元),但我必须在 B 上实现移动构造函数。由于 B 可以看到两个类的内部容器,因此我已经实现了 B 来执行两个类的所有添加和删除操作。
问题是:
我必须为 A 实现移动构造函数,并在该容器上使用 stl::move。将容器移动到新的 A 实例后,通知旧类分离的唯一方法是通过使用 B 的方法,旧 A 的容器并对两个类进行删除。
有没有办法让 B 知道旧 A 的容器已被移动,不能访问它?
没有检查也可以工作,但由于类在 std::move 后没有定义状态,所以不应调用 ::remove()(教授说这是错误的)。
请注意:这是我的家庭作业问题,因此我不希望获得解决完整问题的非法帮助,只需要检查对象的一致性部分以跳过调用其函数。
编辑:添加示例。
重要:
1)我需要使用 std::move。我已经知道使用迭代器在 while 循环中完成所有操作的简单方法。但是,明确要求使用 std::move。
2)此代码片段是为了理解我的问题。作为学生,我想自己解决它,我只需要了解如何在不允许时跳过执行一行即可。
class A;
class B {
public:
// ...... some constructors, functions and destructor.
void add(A *a) {
// .. adds to both containers.
};
void remove(A *a) { // I need to remove from both containers at most of the times
a_container.erase(a);
a->b_container.erase(this); // PROBLEM(!!): after doing std::move(b_container) I shouldn't do this! How to check is b_container moved?
};
private:
std::_______<A*> a_container; //type of container is not important
};
class A {
friend class B;
public:
// ...... some constructors, functions and destructor.
A(A && a) :
b_container(std::move(a.b_container)) {
//..
for (B *b : b_container) {
b->add(this); //adds to B's connected to the old instance
a.remove(*b); //I need somehow to disconect old B's from pointer of moved A.
}
};
void add(B & b) {
b.add(this);
};
void remove(B & b) {
b.remove(this);
};
private:
std::_______<B*> b_container; //type of container is not important
//...
};
A(A && a)
中,你使用了a.remove(*b);
,这对我来说没有多少意义,而且它与你展示的A::remove
不同,因为展示的是A::remove(A*)
,而调用的是A::remove(B)
,除非有某种转换路径。 - luk32