在向量中访问子结构值

时间:2017-04-07 06:43:54

标签: c++

我有一些看起来像这样的Object结构:

struct Object {
   string type;
   Color c;
   float ambient, diffuse;
};

struct Sphere: Object {
   Point center;
   float radius;
};

struct Square: Object {
   Point loc;
   float len;
};

我有一个充满球体和方形结构的向量:

vector<Object> objs;
Sphere sp = //sphere stuff
Square sq = //square stuff
objs.push_back(sp);
objs.push_back(sq);

我可以很好地访问父结构中的值,但是我无法弄清楚如何访问Sphere和Square结构中的值。这就是我现在正在做的事情:

cout << objs.at(i).type << endl; //This works
cout << objs.at(i).center.x << endl; //Not working

有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

你不能,他们不再存在。您没有在Square中存储Spherevector,而只是存储Object。你应该阅读What is object slicing?

也就是说,如果您将指针存储到Objectstd::vector<Object*>,则可以将指针传递给派生类型的对象。但是,您如何知道vector中的哪个元素是Square,哪个元素是Sphere。拥有基类的唯一目的是通过virtual函数为所需的功能提供接口,派生类实现不同的功能方法:

struct Base {
    virtual void foo() { std::cout << "foo in base\n"; }
};
struct Derived1 : Base {
    void foo() override { std::cout << "foo in Derived1\n"; }
};
struct Derived2 : Base {
    void foo() override { std::cout << "foo in Derived2\n"; }
};

Derived2 d;
Base* b = &d;
b->foo(); // prints "foo in Derived2\n"

也就是说,要从Square*获得Object*,如果您确定static_cast<Square*>(objP),则使用Square,如果您确定dynamic_cast<Square*>(objP),则使用import android.support.v4.app.FragmentManager; 不确定(如果你错了,它会返回一个空指针)。 必须这样做可能表明设计不好!

此外,请重新考虑您对通常被视为不良做法的使用:using namespace std;endl(这些是解释的链接)。