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},它在堆栈上定义了一个本地
(这个“阴影”私有成员变量,也称为


如果你想做代码> 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},它在堆栈上定义了一个本地
(这个“阴影”私有成员变量,也称为


如果你想做代码> 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样式的数组

array
set
对构造函数是本地的。因此,指针
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=设定值;

coutarray
set
对于构造函数是本地的。因此,指向
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