C++:基class中的字符串参数在派生class解构时解构
C++: String parameter in base class deconstructs when the derived class deconstruction
我有一个名为 A 的基 class,其中包含一个字符串类型参数。
Class B 派生自 A。
我定义class C 有参数 A* a,并且
分配给B。
在main函数中,获取不到基class的字符串值,因为b解构时它变成了空白
我要它输出:
"Hello!"
"Hello!"
end
但输出是:
"Hello!"
end
这是我的代码:
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
A *a;
public:
void printOut() {
B b("Hello!");
a = &b;
cout << a->str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.a->str << endl;
cout << "end" << endl;
return 0;
}
我该如何处理?
正确,因为 B b("Hello!");
超出范围,c.a
现在是一个悬空指针,在取消引用时会导致未定义的行为。如果你想让它的寿命超过范围,你可以在堆上分配它:
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
A *a;
public:
void printOut() {
B* b = new B("Hello!");
a = b;
cout << a->str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.a->str << endl;
cout << "end" << endl;
delete c.a;
return 0;
}
这很快就会变得混乱,因为您必须跟踪自己分配的内存并适当地调用 delete
,请考虑重新设计或使用智能指针。
为什么要存储 A*
?你知道那是行不通的,所以停止这样做。
制作 A
对象的副本,或它包含的字符串的副本,并停止尝试做一些愚蠢的事情。
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
string str;
public:
void printOut() {
B b("Hello!");
str = b.str;
cout << str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.str << endl;
cout << "end" << endl;
return 0;
}
我有一个名为 A 的基 class,其中包含一个字符串类型参数。
Class B 派生自 A。
我定义class C 有参数 A* a,并且 分配给B。
在main函数中,获取不到基class的字符串值,因为b解构时它变成了空白
我要它输出:
"Hello!"
"Hello!"
end
但输出是:
"Hello!"
end
这是我的代码:
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
A *a;
public:
void printOut() {
B b("Hello!");
a = &b;
cout << a->str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.a->str << endl;
cout << "end" << endl;
return 0;
}
我该如何处理?
正确,因为 B b("Hello!");
超出范围,c.a
现在是一个悬空指针,在取消引用时会导致未定义的行为。如果你想让它的寿命超过范围,你可以在堆上分配它:
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
A *a;
public:
void printOut() {
B* b = new B("Hello!");
a = b;
cout << a->str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.a->str << endl;
cout << "end" << endl;
delete c.a;
return 0;
}
这很快就会变得混乱,因为您必须跟踪自己分配的内存并适当地调用 delete
,请考虑重新设计或使用智能指针。
为什么要存储 A*
?你知道那是行不通的,所以停止这样做。
制作 A
对象的副本,或它包含的字符串的副本,并停止尝试做一些愚蠢的事情。
class A {
public:
string str;
};
class B : public A {
public:
B(string _str) {
str = _str;
}
};
class C {
public:
string str;
public:
void printOut() {
B b("Hello!");
str = b.str;
cout << str << endl;
}
};
int main() {
C c;
c.printOut();
cout << c.str << endl;
cout << "end" << endl;
return 0;
}