我正在编写一个包含两个类的程序:
class Sequence {
protected:
vector<int> seq_;
public:
Sequence(){
for(int i=0; i<16;i++)
seq_.push_back(0);
};
Sequence(int a, int b,int c){
for(int i=0; i<16; i++)
seq_.push_back(a*i+b*i*i+c*i*i*i);
};
Sequence(const Sequence & myseq){
for(int i=0; i<16;i++)
seq_[i]=myseq.Get_i(i);
};
int Get_i(int i)const{
return seq_[i];
};
void Print() const {
for(int i=0; i<16; i++)
cout<<seq_[i]<<endl;
};
int operator*(Sequence & myseq) const {
int sum=0;
for(int i=0; i<16;i++)
sum+=seq_[i]*myseq.seq_[i];
return sum;
};
void operator=(Sequence & myseq) {
for(int i=0; i<16; i++)
seq_[i]=myseq.seq_[i];
};
};
这第一类专门用于包含序列并重载一些基本运算符。另一方面,下面包含对应于数字的二进制序列(如果默认构造函数接收到调用,则包含随机二进制序列)。
class Binary : public Sequence {
private:
public:
Binary(){
for(int i=0; i<16; i++)
seq_.push_back(round(drand48()));
};
Binary(int num){
double prec=num; double last=0;
for(int i=16; i>=0; i--){
prec=prec-last;
if(int(prec/pow(2,i))==0){
seq_.push_back(0);
last=0;
}else{
seq_.push_back(1);
last=pow(2,i);
}
}
};
Binary not_ () {
Binary mybin;
for(int i=0; i<16; i++){
if( seq_[i]==1){
mybin.seq_[i]=0;
}else{
mybin.seq_[i]=1;
};
};
return mybin;
};
int cost (Sequence myseq){
int k=myseq*(*this)-(Binary::not_())*myseq;
return k;
};
};
问题在于我只是定义了一个向量的分段错误:
vector<Binary> mybins (pow(2,16));
我运行GDB并且它停留在复制构造函数中:
Sequence(const Sequence & )
我想知道你是否可以给我任何帮助来找到错误并向我解释。我猜它与我对标准库如何工作的了解不足有关! 谢谢你的时间。
答案 0 :(得分:2)
=ROUND(value,sigfigs-(1+INT(LOG10(ABS(value)))))
这是一个构造函数。它正在构建一个新对象。
Sequence(const Sequence & myseq){
for(int i=0; i<16;i++)
seq_[i]=myseq.Get_i(i);
成员是最初为空的向量。尝试在向量中设置不存在的值是未定义的行为,以及崩溃的原因。您的其他构造函数正确地使用seq_
将新值插入向量中。这也应该在这里完成。
答案 1 :(得分:0)
所有构造函数都以空seq_
开头并正确使用push_back
来增长它并向其中添加元素...除了复制构造函数,它也以#{1}开头但是使用seq_
代替。因此,它访问的元素不在向量中,为您提供未定义的行为。
要正确解决此问题,请完全删除复制构造函数。然后编译器将为您生成一个,这将完成您所需要的。作为奖励,它还会生成移动构造函数。