【问题标题】:Map value is a pointer to an abstract class [closed]映射值是指向抽象类的指针[关闭]
【发布时间】:2017-04-26 14:33:47
【问题描述】:

我有一个抽象类:class Abstract_class {..};

还有一个来自派生类的对象:Derived_class Ob;

还有:string name;map<string,Abstract_class*>mp;

如何正确地做这样的事情:mp[name]=&Ob;

编辑:这是一个例子

Abstract_class {..};

int main(){

    map<string,Abstract_class*>mp;

    for(int i=0;i<n;i++){
        int a,b,c; cin>>a>>b>>c;
        Derived_class Ob(a,b,c);
        string name; cin>>name;
        mp[name]=&Ob;
    }

    string s; cin>>s;
    Abstract_class* ptr=mp[s];
    ptr->Print(); // segmentation fault (core dumped)
    //Note: Print() is virtual function.
}

【问题讨论】:

  • 究竟是什么不起作用?
  • 只是问正确与否?我没有任何编译错误,但是在调用像这样的任何纯虚函数时出现“分段错误(核心转储)”: Abstract_class* ptr=mp["...."]; ptr->func();
  • 请发布一个最小的完整示例(我们可以编译的 1 文件、10 行程序)以显示错误
  • @Abdulkader 我没有说在这里复制你的程序。我说你应该发布一个小程序来展示你正在谈论的特定行为。请点击此链接:stackoverflow.com/help/mcve
  • 正如@RichardHodges 所建议的,与其用散文描述你的代码,不如准备并展示an MCVE。你现在想让我给你一些建议,考虑到你的代码细节——我看不到的代码。盲人能提供的帮助只有这么多。

标签: c++ pointers reference stl abstract-class


【解决方案1】:

您的代码中的问题就在这里:

for(int i=0;i<n;i++){
    int a,b,c; cin>>a>>b>>c;
    Derived_class Ob(a,b,c); // Oops!
    string name; cin>>name;
    mp[name]=&Ob;
}

您已在此 for 循环中将 Derived_class 声明为局部变量。这意味着对象 Ob 仅在当前 for 循环迭代运行时才存在。一旦循环迭代结束,Ob 的生命周期就结束了,该对象不再存在,并且您现在在映射中有一个指向死对象的指针。这不好!

要解决这个问题,请动态分配对象:

for(int i=0;i<n;i++){
    int a,b,c; cin>>a>>b>>c;
    Derived_class* Ob = new Derived_class(a,b,c); // Yay!
    string name; cin>>name;
    mp[name]=Ob;
}

好消息是这个问题与多态性或抽象类或类似的东西无关。这只是一个简单明了的指针问题。

为防止内存泄漏,您可能需要考虑使用值类型类似于shared_ptr&lt;Abstract_class&gt;unique_ptr&lt;Abstract_class&gt; 而不是Abstract_class* 的映射。这会自动为你清理内存。

【讨论】:

  • 现在可以工作了,谢谢。
  • 您的意思是调用 ptr->Print() 不被视为多态(在您回答之后):( ?
  • 没有看到更多代码我不能肯定地说。如果您好奇,可以考虑发布另一个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多