我真的不知道該把什么作為這個標題,所以忽略它。我也不知道如何描述這個問題,所以這是我的問題。
#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: ?
我不確定為什么我宣告它們的順序會影響任何事情,或者為什么我得到的是笑臉而不是笑臉。任何幫助表示贊賞,謝謝!
uj5u.com熱心網友回復:
問題出在這里:
ClassA(ClassB n) {
ptr = &n;
}
ClassB 是一個臨時變數,在函式結束時被破壞。指標變得無效,程式變得瘋狂。
一個簡單而安全的方法是使用 std::unique_ptr 并傳遞引數。unique_ptr 會在 ClassA 被洗掉時自動洗掉 ClassB:
private:
std::unique_ptr<ClassB> ptr;
public:
ClassA(char t, int v) {
ptr = std::make_unique<ClassB>(t, v);
}
也只是保留一個值而不是一個指標。
uj5u.com熱心網友回復:
不要將 ClassA 中的指標用于 ClassB。因為在 for 回圈之后不再存在 ClassB 的物件。因此,在 ClassA 中至少保留一個 ClassB 的副本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369845.html
