C++ c++;访问类的私有数据
我不知道我做错了什么?我有一个类,它有私有数据:C++ c++;访问类的私有数据,c++,C++,我不知道我做错了什么?我有一个类,它有私有数据: static const int SIZE = 101; int *ptr; int set [SIZE]; 我有两个构造器。一个是将数组设置为0的默认构造函数。 另一个接受5个参数并将数组中的5个值设置为1。 我需要打印这个数组。当我在施工时,一切都在工作,当我这样做时,您的每个构造函数都声明了一个名为set的新数组,该数组对类成员进行阴影处理。您的每个构造函数都声明了一个名为set的新数组,该数组对类成员进行阴影处理。您正在将ptr设置为构
static const int SIZE = 101;
int *ptr;
int set [SIZE];
我有两个构造器。一个是将数组设置为0的默认构造函数。
另一个接受5个参数并将数组中的5个值设置为1。
我需要打印这个数组。当我在施工时,一切都在工作,当我这样做时,您的每个构造函数都声明了一个名为
set
的新数组,该数组对类成员进行阴影处理。您的每个构造函数都声明了一个名为set
的新数组,该数组对类成员进行阴影处理。您正在将ptr设置为构造函数中定义的set,而不是类变量的set。在构造函数中更改以下内容:
int set[SIZE] = {0};
ptr = set;
到
您正在将ptr设置为构造函数中定义的集合,而不是类变量的集合。在构造函数中更改以下内容:
int set[SIZE] = {0};
ptr = set;
到
你把
int集[SIZE]={0}构造函数中的code>,它在堆栈上定义了一个本地集
(这个“阴影”私有成员变量,也称为集
)
如果你想做代码> set [Stsie]=0 (将SET的最后一个元素设置为0),那么你就有第二个错误:你正在访问 set <代码>界外(C和C++中的数组是0索引的,所以大小5的数组有有效的索引(0, 1, 2,3和4))。您应该执行设置[SIZE-1]=0
。或者更好地使用std::vector
或std::array
(C++11)而不是C样式的数组
你把int集[SIZE]={0}构造函数中的code>,它在堆栈上定义了一个本地集
(这个“阴影”私有成员变量,也称为集
)
如果你想做代码> set [Stsie]=0 (将SET的最后一个元素设置为0),那么你就有第二个错误:你正在访问 set <代码>界外(C和C++中的数组是0索引的,所以大小5的数组有有效的索引(0, 1, 2,3和4))。您应该执行设置[SIZE-1]=0
。或者更好地使用std::vector
或std::array
(C++11)而不是C样式的数组
arrayset
对构造函数是本地的。因此,指针ptr
指向set
,随后指向NULL,因为当控件离开构造函数时,数组set
不存在
使用数组set
,它是实例变量,以便在构造函数和print
方法中都有相同的set
实例
IntegerSet::IntegerSet() //default constructor
{
set[SIZE-1] = {0};
ptr = set;
cout << "Default Constructor: " << endl;
for (int i =0; i<SIZE ;i++)
{
cout << set[i] << " ";
}
cout << endl;
}
IntegerSet::IntegerSet(int a, int b, int c, int d, int e)
{
set[SIZE-1] = {0};
ptr = set;
ptr[a] = ptr[b] = ptr[c] = ptr[d] = ptr[e] = 1;
cout << "Constructor with 5 parametrs: " << endl;
for (int i =0; i<SIZE ;i++)
{
cout << ptr[i] << " ";
}
cout << endl;
}
IntegerSet::IntegerSet()//默认构造函数
{
设置[SIZE-1]={0};
ptr=设定值;
coutarrayset
对于构造函数是本地的。因此,指向set
的指针ptr
,随后指向NULL,因为控件离开构造函数时数组set
不存在
使用数组set
,它是实例变量,以便在构造函数和print
方法中都有相同的set
实例
IntegerSet::IntegerSet() //default constructor
{
set[SIZE-1] = {0};
ptr = set;
cout << "Default Constructor: " << endl;
for (int i =0; i<SIZE ;i++)
{
cout << set[i] << " ";
}
cout << endl;
}
IntegerSet::IntegerSet(int a, int b, int c, int d, int e)
{
set[SIZE-1] = {0};
ptr = set;
ptr[a] = ptr[b] = ptr[c] = ptr[d] = ptr[e] = 1;
cout << "Constructor with 5 parametrs: " << endl;
for (int i =0; i<SIZE ;i++)
{
cout << ptr[i] << " ";
}
cout << endl;
}
IntegerSet::IntegerSet()//默认构造函数
{
设置[SIZE-1]={0};
ptr=设定值;
cout以下是对垃圾输出的解释:
ptr[a] = ptr[b] = ptr[c] = ptr[d] = ptr[e] = 1;
// ...
for (int i = 0; i < SIZE; i++)
{
cout << ptr[i] << " ";
}
这没什么错。问题是它下面发生了什么。在for()
循环中,您试图从它的第一个索引(0
)迭代ptr
)到SIZE
。您只为数组中的5个位置指定了值,因此其他位置未初始化。这会导致程序出现未定义的行为,也是garabage输出的原因
您应该分别使用索引打印这些值
但除非您能告诉我们您这样做的原因,否则我无法推荐更好的替代方法。以下是对垃圾输出的解释:
ptr[a] = ptr[b] = ptr[c] = ptr[d] = ptr[e] = 1;
// ...
for (int i = 0; i < SIZE; i++)
{
cout << ptr[i] << " ";
}
这没什么错。问题是它下面发生了什么。在for()
循环中,您试图从它的第一个索引(0
)迭代ptr
)到SIZE
。您只为数组中的5个位置指定了值,因此其他位置未初始化。这会导致程序出现未定义的行为,也是garabage输出的原因
您应该分别使用索引打印这些值
但是,除非您能告诉我们您这样做的原因,否则我无法推荐更好的替代方法。此外,我的建议与代码的质量和可维护性有关。对于编译时数组,您应该使用容器,如std::array
,对于数据成员的初始化
您的错误理解为以下代码行将set
的内容设置为0
int set[SIZE] = {0};
相反,它会覆盖IntegerSet
类中的私有数据成员set
,并在构造函数中创建一个局部变量。这是您应该使用STL容器实现这些功能的原因之一。例如:
#include <array> // for std::array
class IntegerSet
{
private:
std::array<int, 101> set;
public:
IntegerSet()
: set() // zero-initializes each element
{
for (auto val : set)
std::cout << val " ";
std::cout << std::endl;
}
IntegerSet(int a, int b, int c, int d, int e)
: set()
{
set[a] = set[b] = set[c] = set[d] = set[e] = 1;
for (auto val : set)
std::cout << val " ";
std::cout << std::endl;
}
};
#include//for std::array
类整数集
{
私人:
std::数组集;
公众:
整数集()
:set()//零初始化每个元素
{
用于(自动值:设置)
std::cout除此之外,我的建议与代码的质量和可维护性有关。对于编译时数组,您应该使用诸如std::array
之类的容器,以及用于初始化数据成员的成员初始值设定项列表
您的错误理解为以下代码行将set
的内容设置为0
int set[SIZE] = {0};
相反,它掩盖了I中的私有数据成员set