gpt4 book ai didi

c++ - 如何从具有不同构造函数的父类(super class)访问子类的成员?

转载 作者:太空宇宙 更新时间:2023-11-04 15:37:00 25 4
gpt4 key购买 nike

我有以下类和类型定义:

class Object

{
protected:
long int id;
public:
Object(void);
~Object(void) {};
long int get_id(void);
};

typedef map<string, Object> obj_map;

然后我有了它的 child :

class Image: public Object

{
private:
path full_path;
int x;
int y;
img image;
public:
Image(path p, int x_pos = 0, int y_pos = 0);
~Image(void) {};

void draw(int flags = 0);
void move_north(float velocity);
void move_south(float velocity);
void move_west(float velocity);
void move_east(float velocity);

path get_path(void);
img get_image(void);
int get_x(void);
int get_y(void);
void set_path(path p);
void set_image(img _image);
void set_x(int value);
void set_y(int value);
};

每个对象都存储在这个静态映射 obj_map 中,在一个名为 App 的类中。所以让我们假设我们在键 foo 下有一个对象。我们可以这样打印它的 id:

cout << App::objects.find("foo")->second.get_id() << endl;

现在,假设我已将一个 Image 对象作为值传递给此 map 。当我尝试访问它时,我可以正常访问id。但是,当我尝试访问 Image 方法时:

cout << App::objects.find("foo")->second.get_x() << endl;

我得到一个:

error: 'class Object' has no member named 'get_x'

那是因为 Object 类实际上没有它。所以,我尝试转换它:

cout << static_cast<Image>(App::objects.find("foo")->second).get_x() << endl;

我明白了:

error: no matching function for call to 'Image::Image(Object&)'

如果我尝试 dynamic_cast,我会得到一些可怕的东西......

error: cannot dynamic_cast 'App::objects.std::map<_Key, _Tp, _Compare, _Alloc>::find<std::basic_string<char>, Object, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, Object> > >((* & std::basic_string<char>(((const char*)"foo"), (*(const std::allocator<char>*)(& std::allocator<char>()))))).std::_Rb_tree_iterator<_Tp>::operator-><std::pair<const std::basic_string<char>, Object> >()->std::pair<const std::basic_string<char>, Object>::second' (of type 'class Object'

我不明白。构造函数不被继承。构造函数与它无关。 Image 对象具有完全不同的构造函数,但它是一个对象。关键是:我无法创建图像映射,因为最终我的引擎中会有很多对象,我希望能够从父类(super class)访问它们。

最佳答案

这张 map :

typedef map<string, Object> obj_map;

仅商店Object对象。当您尝试将 Image中,它被切成薄片,你失去了图像中实际上不属于 Object 的所有内容。 .

您似乎正在寻找的行为称为多态性。要激活它,您必须做两件事:

  • 制作Object多态
  • 存储指向 map 中对象的指针

第一部分很简单:添加virtual之前 ~Object(void) .

对于第二部分,可以使用三种开箱即用的方法:

map<string, Object *>              // 1
map<string, unique_ptr<Object>> // 2
map<string, shared_ptr<Object>> // 3

这些选项之间的区别在于您希望如何管理这些对象的生命周期。

如果 map 应该拥有对象,请使用 (2) 或 (3)。如果单个对象可能出现在 map 中的多个地方,或者您希望能够复制 map ,或者 map 外部可能有引用引用同一个对象,请使用(3);否则使用 (2)。

如果您使用 (1),您必须注意对象是否正确 delete d 他们在 map 中的最后一次使用之后。

您可能需要 #include <memory>使用智能指针类。

插入一个对象分别看起来像:

map["foo"] = new Image(....);
map["foo"] = make_unique<Image>(....);
map["foo"] = make_shared<Image>(....);

您实际上可以使用 new 中的赋值, 或 .reset()对于最后两个,但是 make_函数是首选样式。

关于c++ - 如何从具有不同构造函数的父类(super class)访问子类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30972447/

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