gpt4 book ai didi

c++ - 类(class)的私有(private)成员在我的类(class)实例化期间发生了变化,即使他们不应该

转载 作者:行者123 更新时间:2023-11-28 04:12:56 25 4
gpt4 key购买 nike

我的问题是:为什么我的函数 GetNumberOfRows()GetNumberOfColumns() 没有返回我在构造函数中指定的值?

我有一个类模板,它为存储为 std::vector 的 Matrix 分配内存。作为此类的私有(private)成员,我有行数和列数(mNumRowsmNumCols)。我有一个构造函数,它将行数和列数作为参数并创建一个 std::vector 来存储值。我创建了断言以确保当我索引时,矩阵,索引不得超过行数或列数。当重载 * 运算符时,我断言矩阵列和 vector 大小相同(当我的矩阵类与 vector 类相乘时)。我的程序编译通过了,但是在我的程序执行过程中,我一直收到断言错误,因此我检查了 mNumRowsmNumCols 的值,结果证明是 31 和 0,尽管我在构造函数中将它们指定为 2 和 2。

当将 mNumRowsmNumCols 指定为类中的数字时,我的程序给出了正确的结果,但我希望能够在我的主文件中指定它。我提供了我的头文件,其中指定了我的类。

template<typename T> class Matrix
{
private:
std::vector<T> mData; // entries of matrix
int mNumRows;
int mNumCols; // dimensions
int N;

public:
// copy constructor
Matrix(const Matrix& otherMatrix)
{
mNumRows = otherMatrix.mNumRows;
mNumCols = otherMatrix.mNumCols;
std::vector<T> mData;
for (int i = 0; i < otherMatrix.N; i++)
{
mData = otherMatrix.mData;
}
}

// Storing matrix as a flattened matrix
// And using std::vector
Matrix(int numRows, int numCols)
{
assert(numRows > 0);
assert(numCols > 0);
int mNumRows = numRows;
int mNumCols = numCols;
int N = mNumRows * mNumCols;
for (int i = 0; i < N; i++)
{
mData.push_back(0.0);
}
}

~Matrix()
{
mData.clear();
}

int GetNumberOfRows() const
{
return mNumRows;
}

int GetNumberOfColumns() const
{
return mNumCols;
}
};

在我写的主文件中。

Matrix mat(2, 2);

std::cout << mat.GetNumberOfRows() << ", " << mat.GetNumberOfColumns() << std::endl;

mat.~Matrix();

输出的是31, 0,应该是2, 2,为什么行和列都变了?

最佳答案

问题是因为构造函数中的这三行:

int mNumRows = numRows;
int mNumCols = numCols; // Corrected from question which had assignment from numRows
int N = mNumRows * mNumCols;

它们定义了三个和局部变量,与同名成员变量没有关系。当构造函数结束时,对这些局部变量的所有更改都将丢失。

一种解决方案是对成员变量使用普通赋值:

mNumRows = numRows;
mNumCols = numCols;
N = mNumRows * mNumCols;

但我更建议您了解构造函数初始化列表,您可以在其中直接初始化成员变量:

Matrix(int numRows, int numCols)
: mNumRows(numRows), mNumCols(numCols), N(mNumRows * mNumCols)
{
// The rest of the constructor...
}

您在复制构造函数中遇到了同样的问题,您定义了一个新的局部变量 mData,它隐藏了同名的成员变量。


略知std::vector constructors你根本不需要构造函数中的任何东西,它都可以使用构造函数初始化列表来初始化:

Matrix(int numRows, int numCols)
: mData(numRows * numCols), mNumRows(numRows), mNumCols(numCols)
{
// Totally empty!
}

请注意,我没有初始化 N。那是因为不需要它,你可以通过它的size函数从vector中获取N的值。

另请注意,我没有为 vector 的内容指定默认值。那是因为这些值将是默认构造的。对于像 intfloat 这样的简单类型,这意味着值将为零。

关于c++ - 类(class)的私有(private)成员在我的类(class)实例化期间发生了变化,即使他们不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com