我有一个具有两个指针的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;
}
调试时,我看到操作完成后,下一个调用的函数是用于复制的构造函数,并且start
和finish
未初始化。我不明白在第一个示例中如何初始化它们并在构造函数中对其进行初始化时,如何将它们未初始化。我也收到了两个警告(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();
}