【问题标题】:Only one variable is working at a time, and it is dependent on which order I declare them in一次只有一个变量在工作,这取决于我声明它们的顺序
【发布时间】:2022-01-05 09:06:44
【问题描述】:

我真的不知道该写什么作为标题,所以忽略它。我也不知道如何描述这个问题,所以这是我的问题。

#include <iostream>
#include <vector>

class ClassB {
public:
  //LOOK AT THIS PART
  int value;
  char letter;
  ClassB(char t, int v) {
    letter = t;
    value = v;
  }
};

class ClassA {
private:
  ClassB* ptr;
public:
  ClassA(ClassB n) {
    ptr = &n;
  }
  ClassB* getPtr(){
    return ptr;
  }
};

int main() {
  std::vector<ClassA> objects;
  for(int i=0;i<4;i++) {
    objects.push_back(ClassA(ClassB('a',i)));
  }
  std::cout << "Value: " << objects[1].getPtr()->value << std::endl;
  std::cout << "Letter: " << objects[1].getPtr()->letter;
  return 0;
}

在这段代码中,我应该收到的输出是

Value: 1
Letter: a

但是我收到了这个

Value: 1
Letter

另外,如果我要在值之前声明字母(查看代码中的注释),那么输出会说

Value: 0
Letter: ☺

我不确定为什么我声明它们的顺序会影响任何事情,或者为什么我得到的是笑脸而不是 a。感谢您的帮助,谢谢!

【问题讨论】:

  • 你有未定义的行为,因为这里:ClassA(ClassB n) { ptr = &amp;n; } 指针指向一个本地然后超出范围。
  • 传递给ClassA的构造函数的对象也是临时的。您正在存储指向对象的指针,而没有反映这些对象的生命周期。

标签: c++ class


【解决方案1】:

问题出在这里:

 ClassA(ClassB n) {
    ptr = &n;
  }

ClassB 是一个临时变量,在函数结束时被破坏。指针失效,程序发疯。

解决此问题的一种简单而安全的方法是使用 std::unique_ptr 并传递参数。删除 ClassA 时 unique_ptr 会自动删除 ClassB:

private:
  std::unique_ptr<ClassB> ptr;
public:
  ClassA(char t, int v) {
    ptr = std::make_unique<ClassB>(t, v);
  }

还有一个值而不是指针。

【讨论】:

  • 我会说 n 是一个 local 变量。 ClassB 不是变量,并且您描述的变量不是“临时”,在该词的传统用法中。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2019-08-28
  • 2016-03-16
  • 2022-01-09
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多