如何删除使用父指针作为函数形式参数的子类指针?
How to delete subclass pointer where use parent pointer as formal parameters in function?
删除子class点时遇到问题。我想删除 subclass 指针使用 parent class 指针作为形式参数。我的代码如下。
class Test
{
public:
virtual ~Test() = default;
int a =10;
};
class TestChild : public Test
{
public:
int c ;
};
class A
{
public:
A(){
TestChild* tc = new TestChild();
tc->c = 19;
delTest(tc);
}
void delTest(Test* &ds){
delete ds;
ds = nullptr;
}
};
构建项目会报错:
cannot bind non-const lvalue reference of type 'Test*&' to an rvalue of type 'Test*'
如果我修改函数为void delTest(Test**ds){ delete *ds; *ds=nullptr;}
和delTest(&tc);
,我也报错:
invalid conversion from 'TestChild**' to 'Test**'
我需要做什么才能使我的代码正常工作?
What do I need to do to make my code work?
您可以创建函数模板以支持 delete
和 delete[]
+ 将指针设置为 nullptr
:
template<typename T>
void delete_and_nullify_single_element_pointer(T*& ptr) {
delete ptr;
ptr = nullptr;
}
template<typename T>
void delete_and_nullify_array_pointer(T*& ptr) {
delete[] ptr;
ptr = nullptr;
}
class A {
public:
A() {
TestChild* tc = new TestChild;
tc->c = 19;
delete_and_nullify_single_element_pointer(tc);
}
};
删除子class点时遇到问题。我想删除 subclass 指针使用 parent class 指针作为形式参数。我的代码如下。
class Test
{
public:
virtual ~Test() = default;
int a =10;
};
class TestChild : public Test
{
public:
int c ;
};
class A
{
public:
A(){
TestChild* tc = new TestChild();
tc->c = 19;
delTest(tc);
}
void delTest(Test* &ds){
delete ds;
ds = nullptr;
}
};
构建项目会报错:
cannot bind non-const lvalue reference of type 'Test*&' to an rvalue of type 'Test*'
如果我修改函数为void delTest(Test**ds){ delete *ds; *ds=nullptr;}
和delTest(&tc);
,我也报错:
invalid conversion from 'TestChild**' to 'Test**'
我需要做什么才能使我的代码正常工作?
What do I need to do to make my code work?
您可以创建函数模板以支持 delete
和 delete[]
+ 将指针设置为 nullptr
:
template<typename T>
void delete_and_nullify_single_element_pointer(T*& ptr) {
delete ptr;
ptr = nullptr;
}
template<typename T>
void delete_and_nullify_array_pointer(T*& ptr) {
delete[] ptr;
ptr = nullptr;
}
class A {
public:
A() {
TestChild* tc = new TestChild;
tc->c = 19;
delete_and_nullify_single_element_pointer(tc);
}
};