有什么方法可以检查std :: move是否已在某些STL容器上完成?
我有两种类型的类(让我们说A和B),它们将另一个类的(某些)实例保存在内部容器中。如果A的实例在其容器中保留B的实例,那么B的该实例也必须在其容器中保留A的相同实例。
A可以看到B的私有方法(B就像它的朋友一样),但是我必须在B上实现move构造函数。由于B可以看到B的内部容器,所以我实现B对这两个类都进行了添加和删除。
问题是:
我必须为A实现move构造函数,并在该容器上使用stl :: move。在将容器移动到A的新实例之后,通知B旧类脱离的唯一方法是通过使用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
//...
};
有什么方法可以检查std :: move是否已在某些STL容器上完成?
该的std ::移动模板不移动任何东西,它只是
获取对其参数的右值引用,并将其转换为xvalue。
如果b_container(std::move(a.b_container))
编译了类似于的代码,则std::move
“ works”b_container
具有的move构造函数,而move构造函数将移动指定为参数的对象的内部。否则,代码将无法编译。以下示例由于缺少move构造函数而无法编译。这是在大肠杆菌上。
#include <utility>
class B {
public:
B() = default;
B(B &&) = delete;
};
int main() {
B b0;
B b1(std::move(b0));
return 0;
}
以上文字总结。std::move
始终“有效”。
未指定移动对象的状态。Link#00和Link#01解释了此行为。
B有什么办法知道旧的A的容器已移动并且它不应该访问它吗?
无法检查旧容器是否已移动,即无法检查其状态。但是可以访问它,例如调用std::vector::empty
方法,因为对象是有效的。请参阅此链接以获取解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句