【发布时间】: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 = &n; }指针指向一个本地然后超出范围。 -
传递给
ClassA的构造函数的对象也是临时的。您正在存储指向对象的指针,而没有反映这些对象的生命周期。