在C ++类方法中访问私有指针变量

时间:2017-01-09 06:13:36

标签: c++ c++11

我有这段代码:

#include<iostream>

class Test {
  private:
    int iNum;
    int *ptr;

  public:
    Test(int iFirst, int iSecond);
    void setNum(int iValue);
    int getNum();
    int getFirstNum();
    int getSecondNum();
};

Test::Test(int iFirst, int iSecond) {
  int *ptr = (int *)malloc(sizeof(int) * 2);
  ptr[0] = iFirst;
  ptr[1] = iSecond;
}

void Test::setNum(int iValue) {
  iNum = iValue;
}

int Test::getNum() {
  return iNum;
}

int Test::getFirstNum() {
  return ptr[0];
}

int Test::getSecondNum() {
  return ptr[1];
}

int main() {
  Test oTest(3,4);

  std::cout << oTest.getFirstNum() << std::endl;
  return 0;
}

当我尝试使用getFirstNum()方法返回ptr [0]时,我只是不明白为什么我会得到垃圾值。请告诉我这在内存中的表现以及修复它的可能方法。谢谢你

3 个答案:

答案 0 :(得分:2)

你的错误在你的构造函数中:

int *ptr = (int *)malloc(sizeof(int) * 2);

在这里,您要声明一个名为ptr的变量。但是,您已经有一个名为ptr的变量作为您的类的成员。这称为 shadowing 。您的编译器将始终使用具有最窄范围的变量版本,在本例中是您在构造函数中声明的那个。当构造函数返回时,它会被抛弃,而类中的ptr永远不会被触及。

要解决此问题,请不要重新声明变量:

ptr = (int *)malloc(sizeof(int) * 2);

答案 1 :(得分:2)

int *ptr = (int *)malloc(sizeof(int) * 2);

在内部构造函数中,您创建了一个新指针ptr,从而遮蔽了类成员ptr。由于它是一个新指针,因此您的班级成员ptr永远不会被初始化。从此行中删除int *,这将初始化类成员ptr

ptr = (int *)malloc(sizeof(int) * 2);

另一件事是因为你为ptr动态分配内存,你必须在析构函数中删除它。否则你会泄漏内存。

答案 2 :(得分:-1)

#include<iostream>

class Test {
private:
    int iNum;
    int *ptr;

public:
    Test(int iFirst, int iSecond);
    ~Test();
    void setNum(int iValue);
    int getNum();
    int getFirstNum();
    int getSecondNum();
};

Test::Test(int iFirst, int iSecond) {
    ptr = new int[2];
    ptr[0] = iFirst;
    ptr[1] = iSecond;
}

Test::~Test()
{
    delete[] ptr;
}

void Test::setNum(int iValue) {
    iNum = iValue;
}

int Test::getNum() {
    return iNum;
}

int Test::getFirstNum() {
    return ptr[0];
}

int Test::getSecondNum() {
    return ptr[1];
}

int main() {
    Test oTest(3, 4);

    std::cout << oTest.getFirstNum() << std::endl;
    return 0;
}

你将它视为c,而不是c ++。我修复了我看到的问题,你使用的是malloc而不是new,而且你正在创建一个新的int * ptr并且没有使用成员,因此当你在getter函数中调用它时它无效。

也是一个析构函数并删除内存。