我有一个类,它引用了另一个结构。
struct DNA { ... };
class Cohort {
private:
DNA& genetics;
...
public:
Cohort(DNA& g) : genetics(g) {}
...
};
然后我有一个Cohort
s的向量。
std::vector<Cohort> cohorts;
然后我必须在向量的开头插入同类群组。
cohorts.insert(cohorts.begin(), Cohort(eggs, genetics));
我得到一个错误。
error: object of type 'Thor_Lucas_Development::Cohort' cannot be assigned because its copy assignment
operator is implicitly deleted
我假设将项目插入到向量中时,将其复制进来。由于我在Cohort
的类中有一个引用,因此它的复制分配运算符被隐式删除。
所以...发生了什么事?在处理Cohort
类时,我只是不能使用向量?还是必须我在new
上Cohort
并在向量中有指向它的指针?
有点烦人。
答案 0 :(得分:1)
您可以就地构建对象:
cohorts.emplace(cohorts.begin(), eggs, genetics);
但是引用成员很少是一个好主意-改用指针。
而且,如果您多次插入开头,则可能需要std::deque
而不是std::vector
。
答案 1 :(得分:0)
如错误消息所述,您不能在活动对象中重新绑定引用,这就是默认情况下删除分配的原因。
除了将指针存储在向量中之外,您还可以以某种方式重写您的类:
I。使用指针而不是引用。在此用例中,它们非常像值:
#include <vector>
struct Nyan {
int *x;
};
int main() {
int x;
std::vector<Nyan> v{{&x}, {&x}, {&x}};
v.insert(v.begin(), Nyan{&x});
}
(作为参考的替代品,普通指针完全可以,但是如果需要,可以使用<memory>
中定义的任何包装器。)
您甚至可以添加一些保护以禁止空指针:
struct Nyan {
Nyan(int &x): x(&x) {}
private:
int *x;
};
II。 std::reference_wrapper
最早是在C ++ 11中引入的,以适应不可重新绑定性,以便将引用存储在容器中:
#include <vector>
#include <functional>
struct Nyan {
std::reference_wrapper<int> x;
};
int main() {
int x;
std::vector<Nyan> v{{x}, {x}, {x}};
v.insert(v.begin(), Nyan{x});
}