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

Accessing private pointer variables in C++ class methods

本文关键字:指针 变量 C++ 类方法 访问      更新时间:2023-10-16

我有这个代码:

#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] 时我得到垃圾值。请启发我这在内存中的行为以及修复它的可能方法。谢谢i

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

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

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

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

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

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

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

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

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

#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 而不是新的,而且您正在创建一个新的 int*ptr 而不是使用成员,因此当您在 getter 函数中调用它时它是无效的。

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