gpt4 book ai didi

c++ - 存储派生对象的映射

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:26 24 4
gpt4 key购买 nike

我有父类:

class Data
{
public:
Data ( void ) { }
Virtual int Size ( void )
{
return 100;
}
protected:
map<string, Data*> m;

};

从类 Data 继承的类:

class Struct : public Data
{
public:
Struct ( void ) { }
Struct & Add ( const string & name, Data x )
{
Data * tmp = new Data ( x );
m[name] = tmp;
return *this;
}
void Print ( void )
{
for ( const auto & tmp : m )
cout << tmp . first << " " << tmp . second -> Size () << endl;
}
};

class IntData : public Data
{
public:
IntData ( void ) { }
int Size ( void )
{
return 4;
}
};

class DoubleData : public Data
{
public:
DoubleData ( void ) { }
int Size ( void )
{
return 8;
}

};

主要内容:

int main ( void )
{
Struct a;
a . Add ( "Integer",IntData () );
a . Print ();
return 0;
}

Current output : Integer 100
Expected output : Integer 4

我想创建一个 map ,其中包含派生自 Data 类的各种类型的对象。但是当我想从 map 中存储的对象(在本例中为 IntData )调用方法 Size 时,它​​应该返回 4 它总是从父类 Data 返回值。请问我该如何解决?

最佳答案

这是你的问题:

        Data * tmp = new Data ( x );

您放入 map 的实际指针是 Data 父类的一个实例。您正在从作为参数按值传递的参数复制构建 Data 父类的新实例。

您需要将整个函数更改为:

    Struct & Add ( const string & name, Data *x)
{
m[name] = x;
return *this;
}

调用者现在负责构造任何子类的新实例:

    a . Add ( "Integer",new IntData);

然后,这将按您的预期工作。

当然,这种方法会带来内存泄漏等各种问题,所以您最好使用 std::shared_ptr。但那将是一个不同的问题......

关于c++ - 存储派生对象的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com