C++:派生类解构时基类中的字符串参数解构

Posted

技术标签:

【中文标题】C++:派生类解构时基类中的字符串参数解构【英文标题】:C++: String parameter in base class deconstructs when the derived class deconstruction 【发布时间】:2015-12-16 13:23:18 【问题描述】:

我有一个名为 A 的基类,其中包含一个字符串类型参数。

B 类派生自 A。

我定义类 C 有参数 A* a,并且 将其分配给 B。

在主函数中,我无法获取基类的字符串值,因为它在 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;

我该如何处理?

【问题讨论】:

我该如何处理? -- 这不是一个明确的要求。问题出在哪里很明显——你真正想要做什么并不明显。 您处理undefined behavior 的方法是在不知情的情况下调用它,并在它因错误而发生时对其进行修复。 【参考方案1】:

正确,因为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,考虑重新设计或使用智能指针。

【讨论】:

我试过了,它会输出我想要的东西。谢谢!【参考方案2】:

为什么要存储 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;

【讨论】:

谢谢!我做了一个程序,需要在 C 类中存储 A *。这个程序块是为了简单地理解我想要做什么而编写的。 那么你需要让它指向一个寿命足够长的对象。

以上是关于C++:派生类解构时基类中的字符串参数解构的主要内容,如果未能解决你的问题,请参考以下文章

ES6---解构赋值(数组对象字符串数值和布尔值函数参数)

ES6中的展开运算符和解构对象

虚函数和基类中的this指针的问题!

ES6浅谈--解构,字符串扩展

数组解构

[JavaScript]解构赋值详解