【问题标题】:Iterating through vector of abstract classes遍历抽象类的向量
【发布时间】:2018-11-26 10:40:21
【问题描述】:

已经有类似的问题了,但是没有回答我的问题,所以我再问一遍。

我有这些课程:

#ifndef _OBJECTS_H
#define _OBJECTS_H

#include "ray.h"
#include <cmath>

class Object {
    public:
        Vector3 position, color;
        Object(Vector3 position, Vector3 color): position(position), color(color){};

        virtual bool intersects() = 0;
};

class Sphere : public Object {
    public:
        float radius;
        Sphere(Vector3 center, float radius, Vector3 color): Object(center, color), radius(radius){};

        using Object::intersects;
        bool intersects(const Ray& ray, float& t);
};

#endif

我需要有std::vector 的对象并遍历它:

for(Object s:objects) {
                float t;
                if (s.intersects(ray, t)) {
                    //do something
                }
            }

当我将intersects() 声明为pure virtual 时,它告诉我我不能遍历虚拟类,如果我只将它声明为virtual,那么它告诉我没有实现相交。我做错了什么?

【问题讨论】:

  • 一开始就不能有std::vector&lt;Object&gt;...
  • _OBJECTS_H 是保留标识符。通过定义它,您的程序将具有未定义的行为。
  • @user2079303 您能否提供此声明的来源?谢谢。
  • @KillzoneKid -- “每个包含双下划线 _ 或以下划线后跟大写字母 (2.12) 的名称都保留给实现以供任何使用。” [global.names]/1.
  • @PeteBecker 谢谢。它的措辞给人的印象是_OBJECTS_H 是一个现有的全局标识符,而不是因为它以_O 开头。然而,对于双下划线的使用存在一些歧义。我看到标准中的引号暗示只有开头的__ 被保留,而您发布的引用表明在任何地方使用双下划线都是保留的,句号。

标签: c++ inheritance abstract-class overriding pure-virtual


【解决方案1】:

由于(根据定义)您不能创建抽象类的实例,std::vector&lt;&gt; 不能包含抽象类的实例。您需要更改您的容器以包含 指针。那么指针类型可以是一个抽象类的指针。

【讨论】:

  • 谢谢!我不知道为什么我没有意识到这一点。我改变了它,现在它编译得很好。
猜你喜欢
  • 2021-07-28
  • 2012-05-13
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多