简单的二维数组头文件,打印失败
Simple 2D Array header file, print fails
我正在编写一个简单的头文件,它可以创建一个动态二维数组并将 0 放入行和列、打印数组并删除数组。
在单步调试时,二维数组被初始化,它把 0 放在那里,但是当 my_array.Print_Array();被调用,编译器会跳过它。
当我尝试从主文件打印数组时失败了。任何帮助将不胜感激。
头文件:
class twoD_Array
{
public:
int **Array;
int *col, *row;
int size_col, size_row;
twoD_Array(int, int);
~twoD_Array();
void Print_Array();
};
twoD_Array::twoD_Array(int size_c, int size_r)
{
size_col = size_c;
size_row = size_r;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
Array[i][j] = 0;
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i<size_col; y_i++)
{
for (int x_i = 0; x_i<size_col; x_i++)
std::cout << Array[y_i][x_i];
std::cout << std::endl;
}
}
twoD_Array::~twoD_Array()
{
for (int i = 0; i < size_row; i++)
delete[] Array[i];
delete[] Array;
}
主文件:
#include "stdafx.h"
#include <iostream>
#include "2D_Array.h"
int main()
{
int x, y;
std::cout << "how many x variables?" << std::endl;
std::cin >> x;
std::cout << "how many y variables?" << std::endl;
std::cin >> y;
twoD_Array my_array(x, y);
my_array.Print_Array();
return 0;
}
您在构造函数中使用了局部变量,但在 Print_Array
方法中使用了未初始化的成员变量。您需要在提供它们的构造函数中初始化成员变量 size_col
和 size_row
。另外,要指出的另一件事是,在 Print_Array
方法中,您在 x_i
循环中使用 size_col
而不是 size_row
,这看起来像是一个逻辑错误。
我重写了构造函数和 Print_Array
看起来像这样:
twoD_Array::twoD_Array(int size_col, int size_row)
{
this->size_col = size_col;
this->size_row = size_row;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
{
Array[i][j] = 0;
}
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i < size_col; y_i++)
{
for (int x_i = 0; x_i < size_row; x_i++)
{
std::cout << Array[y_i][x_i];
}
std::cout << std::endl;
}
}
在
twoD_Array::twoD_Array(int size_col, int size_row)
int size_col
定义了一个名为 size_col
的新的临时和局部构造函数变量。这个size_col
和成员变量size_col
没有任何关系,因为它们同名所以局部变量隐藏了成员变量
最终结果在Print_Array
中,成员变量size_col
还没有设置任何值,所以Crom只知道会发生什么。
解决方案:
设置成员变量:
twoD_Array::twoD_Array(int col, int row): size_col(col), size_row(row)
冒号 (:) 告诉编译器即将出现 Member Initializer List。成员初始化器列表允许您在进入构造函数主体之前初始化 class 成员。当你有一个没有默认构造函数的成员变量或需要昂贵的初始化你不想被迫做两次时,这是非常重要的。它还允许您初始化基数 class.
请注意,我还更改了参数的名称以防止将来混淆。
虽然我们在这里,但让我们通过认真地询问 What is The Rule of Three? 来避免可能成为 OP 的下一个问题。单击 link。为您节省大量调试工作。
我正在编写一个简单的头文件,它可以创建一个动态二维数组并将 0 放入行和列、打印数组并删除数组。
在单步调试时,二维数组被初始化,它把 0 放在那里,但是当 my_array.Print_Array();被调用,编译器会跳过它。
当我尝试从主文件打印数组时失败了。任何帮助将不胜感激。
头文件:
class twoD_Array
{
public:
int **Array;
int *col, *row;
int size_col, size_row;
twoD_Array(int, int);
~twoD_Array();
void Print_Array();
};
twoD_Array::twoD_Array(int size_c, int size_r)
{
size_col = size_c;
size_row = size_r;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
Array[i][j] = 0;
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i<size_col; y_i++)
{
for (int x_i = 0; x_i<size_col; x_i++)
std::cout << Array[y_i][x_i];
std::cout << std::endl;
}
}
twoD_Array::~twoD_Array()
{
for (int i = 0; i < size_row; i++)
delete[] Array[i];
delete[] Array;
}
主文件:
#include "stdafx.h"
#include <iostream>
#include "2D_Array.h"
int main()
{
int x, y;
std::cout << "how many x variables?" << std::endl;
std::cin >> x;
std::cout << "how many y variables?" << std::endl;
std::cin >> y;
twoD_Array my_array(x, y);
my_array.Print_Array();
return 0;
}
您在构造函数中使用了局部变量,但在 Print_Array
方法中使用了未初始化的成员变量。您需要在提供它们的构造函数中初始化成员变量 size_col
和 size_row
。另外,要指出的另一件事是,在 Print_Array
方法中,您在 x_i
循环中使用 size_col
而不是 size_row
,这看起来像是一个逻辑错误。
我重写了构造函数和 Print_Array
看起来像这样:
twoD_Array::twoD_Array(int size_col, int size_row)
{
this->size_col = size_col;
this->size_row = size_row;
Array = new int *[size_col];
for (int i = 0; i < size_col; i++)
{
Array[i] = new int[size_row];
for (int j = 0; j < size_row; j++)
{
Array[i][j] = 0;
}
}
}
void twoD_Array::Print_Array()
{
for (int y_i = 0; y_i < size_col; y_i++)
{
for (int x_i = 0; x_i < size_row; x_i++)
{
std::cout << Array[y_i][x_i];
}
std::cout << std::endl;
}
}
在
twoD_Array::twoD_Array(int size_col, int size_row)
int size_col
定义了一个名为 size_col
的新的临时和局部构造函数变量。这个size_col
和成员变量size_col
没有任何关系,因为它们同名所以局部变量隐藏了成员变量
最终结果在Print_Array
中,成员变量size_col
还没有设置任何值,所以Crom只知道会发生什么。
解决方案:
设置成员变量:
twoD_Array::twoD_Array(int col, int row): size_col(col), size_row(row)
冒号 (:) 告诉编译器即将出现 Member Initializer List。成员初始化器列表允许您在进入构造函数主体之前初始化 class 成员。当你有一个没有默认构造函数的成员变量或需要昂贵的初始化你不想被迫做两次时,这是非常重要的。它还允许您初始化基数 class.
请注意,我还更改了参数的名称以防止将来混淆。
虽然我们在这里,但让我们通过认真地询问 What is The Rule of Three? 来避免可能成为 OP 的下一个问题。单击 link。为您节省大量调试工作。