недопустимое новое выражение абстрактного типа класса

В настоящее время я пишу raytracer для университетского класса.
Чтобы загрузить сцены из файлов, я написал sdfloader, чтобы читать файлы sdf и создавать сцены для них.

если я теперь хочу скомпилировать загрузчик, я получаю следующую ошибку:

rc/sdf_loader.cpp: In member function 'void SDFloader::add_shape(std::istringstream&)':
src/sdf_loader.cpp:95:58: error: invalid new-expression of abstract class type 'box'
&scene_.materials[mat]));
^

Я пытался найти решение, но не смог.

Класс sdf_loader выглядит следующим образом:

class SDFloader {
public:
SDFloader();
~SDFloader();

Scene const& scene() const;
void read(std::string file);

private:
void add_material(std::istringstream&);
void add_shape(std::istringstream&);
void add_light(std::istringstream&);
void add_camera(std::istringstream&);
void apply_transformation(std::istringstream&);

private:
Scene scene_;
};

в моей реализации загрузчика sdf я написал метод read ():

void SDFloader::add_shape(std::istringstream& iss) {

std::string name;
iss >> name;

if(name == "box") {
double x1,y1,z1,x2,y2,z2;
std::string mat;
iss >> name >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> mat;
scene_.shapes.insert(new box(point(x1,y1,z1),
point(x2,y2,z2),
name,
&scene_.materials[mat]));
}

и для любой другой формы одинаковые вызовы.

Где проблема в моем коде? Я действительно не вижу этого

я использую g++-4.9 - std=c++0x скомпилировать и связать все

18

Решение

недопустимое new-выражение типа абстрактного класса ‘box’

В сообщении об ошибке нет ничего неясного. Твой класс box имеет по крайней мере один элемент, который не реализован, что означает, что он является абстрактным. Вы не можете создать экземпляр абстрактного класса.

Если это ошибка, исправьте свой класс box, реализовав недостающий элемент (ы).

Если это умышленно, унаследуйте от box, реализуйте недостающий элемент (ы) и используйте производный класс.

43

Другие решения

Если вы используете C ++ 11, вы можете использовать спецификатор «переопределить», и он выдаст вам ошибку компилятора, если вы не корректно переопределяете абстрактный метод. Вероятно, у вас есть метод, который не совпадает точно с абстрактным методом в базовом классе, так что вы его не переопределяете.

http://en.cppreference.com/w/cpp/language/override

6

из-за того, что другие ломали голову, я столкнулся с этой ошибкой, потому что я ненадлежащим образом квалифицировал один из аргументов метода в базовом классе, поэтому производные функции-члены класса не перекрывали его. так что убедитесь, что у вас нет чего-то вроде

class Base
{
public:
virtual void foo(int a, const int b) = 0;
}
class D: public Base
{
public:
void foo(int a, int b){};
}
4

Еще одна возможная причина для будущих Googlers

У меня была эта проблема, потому что метод, который я пытался реализовать, требовал std::unique_ptr<Queue>(myQueue) в качестве параметра, но Queue класс абстрактный Я решил, что с помощью QueuePtr(myQueue) конструктор вроде так:

using QueuePtr = std::unique_ptr<Queue>;

и использовал это в списке параметров вместо этого. Это исправляет это, потому что инициализатор пытается создать копию Queue когда вы делаете std::unique_ptr такого типа, чего не может быть.

0
По вопросам рекламы [email protected]