0

我为 >> 和 << 实现运算符重载

<< 好像没有问题

但是为了实现 operator>> 如下所示,我遇到了运行时错误

QDataStream & operator>> (QDataStream & stream, chromosome & myChromosome){

    myChromosome = chromosome();

    double len, wing1, wing2, tail, head;
    int index;

    stream >> head >> len >> tail >> wing1 >> wing2 >> index;

    myChromosome.setChromosomeHeadLength(head);
    myChromosome.setChromosomeLength(len);
    myChromosome.setChromosomeTailLength(tail);
    myChromosome.setChromosomeWing1Length(wing1);
    myChromosome.setChromosomeWing2Length(wing2);
    myChromosome.setIndex(index);

    return stream;
}

我调试这部分,程序停止(运行时错误),当我到达myChromosome.setChromosomeHeadLength(head);

编辑: 染色体代码:

chromosome::chromosome()
{
    chromosomeLength = 0;
    chromosomeHeadLength = 0;
    chromosomeTailLength = 0;
    chromosomeWing1Length = 0;
    chromosomeWing2Length = 0;
    index = 0;

    topLeftX=0;
    topLeftY=0;
    bottomRightX=0;
    bottomRightY=0;
}
...
void chromosome::setChromosomeLength(double lenght){
    chromosomeLength = lenght;
}

void chromosome::setChromosomeHeadLength(double lenght){
    chromosomeHeadLength = lenght;
}

void chromosome::setChromosomeTailLength(double lenght){
    chromosomeTailLength = lenght;
}

void chromosome::setChromosomeWing1Length(double lenght){
    chromosomeWing1Length = lenght;
}

void chromosome::setChromosomeWing2Length(double lenght){
    chromosomeWing2Length = lenght;
}

当我运行程序时,错误是: myProgram.exe 已停止工作

当我调试它时,我得到了这个 在此处输入图像描述

编辑 2:更多代码,使用 operator>> 和 <<

void TabView::save(QDataStream &stream)
{

    stream << numberOfChromosomes;

    for(int i = 0; i < numberOfChromosomes; i++){
        stream << chromosomes[i];
    }
...
}

bool TabView::load(QDataStream &stream){    

    stream >> numberOfChromosomes;

    for(int i = 0; i < numberOfChromosomes; i++){
        stream >> chromosomes[i];
    }
...
}

任何想法表示赞赏。

4

1 回答 1

1
QDataStream & operator>> (QDataStream & stream, chromosome & myChromosome){

myChromosome = chromosome();

...省略

这部分对我来说看起来真的很奇怪。在我看来,您正在传递一个引用myChromosome,然后直接在它之上构建一个新引用。我不确定这是否是分段错误所在,但如果您使用动态分配的内存,它看起来(正如其他成员所指出的)违反了三规则。

由于您没有为 class 提供标头定义myChromosome,我唯一的猜测是,当您使用赋值运算符创建一个新类时,您会使一些内存空间无效。请记住,这是推测,因为您没有提供.h实现。

于 2013-09-16T21:04:07.157 回答