在复制构造函数中未初始化使用变量

时间:2019-07-23 19:14:27

标签: c++ constructor initialization copy-constructor

我有一个具有两个指针的Matrix类:
Matrix.h

#pragma once

#include "List.h"

class Matrix
{
private:

    list* start;
    list* finish;

public:

    Matrix() :start(nullptr), finish(nullptr) {}
    Matrix(const Matrix& matrix);
    friend Matrix operator+(const Matrix& matrixA, const Matrix& matrixB);

我的问题如下。如果我写这样的话,主要是:

#include <iostream>
#include "Matrix.h"

int main()
{
    Matrix a;
    a.functionToRead();  //doesn't matter just a function that initializes the list
    Matrix b=a;
}

当它调用构造函数进行复制时,我绝对没有问题。
比我的main中是否有以下代码:

#include <iostream>
#include "Matrix.h"

int main()
{
    Matrix a,b,c;
    a.functionToRead();  //doesn't matter just a function that initializes the list
    b.functionToRead();

    c = a + b;
}

调试时,我看到操作完成后,下一个调用的函数是用于复制的构造函数,并且startfinish未初始化。我不明白在第一个示例中如何初始化它们并在构造函数中对其进行初始化时,如何将它们未初始化。我也收到了两个警告(start,一个警告finish),上面写着'Variable Matrix::start' is uninitialized
编辑:复制构造函数的代码

Matrix::Matrix(const Matrix& matrix)
{
    for (list* it = matrix.start; it != nullptr; it = it->next)
    {
        push_back(this->start, this->finish, it->linia, it->coloana, it->valoare);
    }
}

push_back的代码

extern void push_back(list*& start, list*& finish, int linia, int coloana, int valoare)
{
    list* elementNou = new list;

    elementNou->linia = linia;
    elementNou->coloana = coloana;
    elementNou->valoare = valoare;
    elementNou->prev = finish;
    elementNou->next = nullptr;

    if (start == nullptr)
    {
        start = elementNou;
        finish = elementNou;
    }
    else
    {
        finish->next = elementNou;
        finish = elementNou;
    }
}

列表结构:

typedef struct list
{

    int linia;
    int coloana;
    int valoare;

    struct list* next;
    struct list* prev;

}list;

Edit2:functionToRead();

的代码
void Matrice::functionToRead()
{
    std::ifstream in("matrice.in");
    int linia = 0, coloana = 0, valoare = 0;

    if (!empty(start))
    {
        clear(start, finish);
    }

    while (in.peek() != EOF)
    {
        in >> linia >> coloana >> valoare;
        push_back(start, finish, linia, coloana, valoare);
    }

    in.close();
}

0 个答案:

没有答案