Error invalid new expression of abstract class type

I am currently writing a raytracer for a university class. In order to load Scenes from files I wrote an sdfloader to read sdf files and create scenes therefor. if I now want to compile the loader...

I am currently writing a raytracer for a university class.
In order to load Scenes from files I wrote an sdfloader to read sdf files and create scenes therefor.

if I now want to compile the loader i get the following error:

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]));
                                                      ^

I tried to find a solution but failed.

The sdf_loader class looks like the following:

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_;
};

in my implementation of the sdf loader i wrote the method 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]));
    }

and for every other shape the same calls.

Where is the Problem in my code? I really don’t see it

I am using g++-4.9 - std=c++0x to compile and link everything

Homework
I’m getting this type of error for my Merge Sort function. I think the error has something to do with my merge() method, but I thought I took care of it by using it in MergeSort(). Any help would be appreciated.

Sort.h

#ifndef SORT_H_
#define SORT_H_

class Sort {
protected:
   unsigned long num_cmps; // number of comparisons performed in sort function
public:
   virtual void sort(int A[], int size)= 0;    // main entry point
   bool testIfSorted(int A[], int size);        // returns false if not sorted
                                            // true otherwise
   unsigned long getNumCmps() { return num_cmps; }        // returns # of comparisons
   void resetNumCmps() { num_cmps = 0; }
};

class MergeSort:public Sort {       // MergeSort class
public:
  void sort(int A[], int size, int low, int high);      // main entry point
};

#endif

Sort.cpp

 Sort* s;
   switch(op.getAlg()) 
      {
      case 'S':
         s=new SelectionSort();
         break;
      case 'I':
         s=new InsertionSort();
         break;
      case 'B':
         s=new BubbleSort();
         break;
      case 'H':
         s=new HeapSort();
         break;
      case 'R':
         s=new RadixSort();
         radixsortQ = true;
         break;
      case 'M':
         s=new MergeSort(); --> error
         break;
      }

Merge Sort.cpp

#include <iostream>
#include "Sort.h"
using namespace std;
void MergeSort::sort(int A[], int size, int low, int high)          // main entry point
{
    if (low < high){
        int middle = (low + high) / 2;
        MergeSort(A, size, low, middle);
        MergeSort(A, size, middle+1, high);
        merge(A, size, low, middle, high);
    }
}

void merge::sort(int A[], int size, int low, int middle, int high){
    int temp[size];
    for(int i = low; i <= high; i++){
        temp[i] = A[i];
    }
    int i = low;
    int j = middle + 1;
    int k = low;

    while(i <= middle && j <= high){
        if(temp[i] <= temp[j]){
            A[k] = temp[i];
            ++i;
        }
        else {
            A[k] = temp[j];
            ++j;
        }
        ++k;
    }
    while(i <= middle){
        A[k] = temp[i];
        ++k;
        ++i;
    }
}

0 / 0 / 0

Регистрация: 20.01.2013

Сообщений: 108

1

На этапе компиляции игры компилятор выдает ошибку

19.05.2015, 23:42. Показов 6659. Ответов 4


Доброго времени суток!
Делаю игру «Snake» на QT. При компиляции игры , компилятор выдает ошибку — «ошибка: invalid new-expression of abstract class type». Все перерыл, даже не знаю что делать! Помогите пожалуйста! Проект во вложениях.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



20 / 20 / 2

Регистрация: 27.01.2014

Сообщений: 232

20.05.2015, 01:33

2

У тебя Арея от стейт наследуется. Где определены чистые виртуальные функции. В Арее они не все переопределены(какие — пишет компилятор). Следовательно Арея у тебя абстрактный класс следовательно.
Дальше еще куча ошибок вылезает. Неужели трудно билдить поэтапно, а не писать сразу кучу всего, если новичок?



0



alexey_rage

596 / 396 / 79

Регистрация: 23.10.2013

Сообщений: 1,143

20.05.2015, 12:11

3

C++ (Qt)
1
2
3
4
    virtual vector<PaintObject> paint(GameWidget*, QPaintEvent*) = 0;
    virtual void mouse(GameWidget*, QMouseEvent*) = 0;
    virtual void keyPress(GameWidget*, QKeyEvent*, QTimer*) = 0;
    virtual void keyRelease(GameWidget*, QKeyEvent*, QTimer*) = 0;

Ни у одного из этих методов нет реализации.
Соответственно все они должны быть определены в классе Area

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
class Area : public state
{
    Q_OBJECT
 
public:
    explicit Area(QWidget *parent);
 
    static state* instance()
    {
        return new Area();
    }
 
    ~Area();

Для класса Area не объявлен конструктор по умолчанию.

Ну и там дальше вообще хрень какая-то!
класс Area в хедере объявлен как наследник от state, а в .cpp конструктор реализован как наследник от QFrame.

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

p.S.



1



0 / 0 / 0

Регистрация: 20.01.2013

Сообщений: 108

21.05.2015, 22:27

 [ТС]

4

Это реально исправить? Чтобы игра нормально работала.



0



596 / 396 / 79

Регистрация: 23.10.2013

Сообщений: 1,143

22.05.2015, 00:11

5

Цитата
Сообщение от artur4ek94
Посмотреть сообщение

Это реально исправить? Чтобы игра нормально работала.

Конечно реально. Но для этого придется выучить C++ и Qt



0



There are always have a problem that list as follows :

———————————————-separating line —————————————————————
/home/qie/softs/ros_slam/Pangolin/src/video/drivers/openni2.cpp: In member function ‘virtual std::unique_ptrpangolin::VideoInterface pangolin::RegisterOpenNi2VideoFactory()::OpenNI2VideoFactory::Open(const pangolin::Uri&)’:
/home/qie/softs/ros_slam/Pangolin/src/video/drivers/openni2.cpp:656:71: error: invalid new-expression of abstract class type ‘pangolin::OpenNi2Video’
nivid = new OpenNi2Video(pangolin::PathExpand(uri.url));

/home/qie/softs/ros_slam/Pangolin/src/video/drivers/openni2.cpp:658:54: error: invalid new-expression of abstract class type ‘pangolin::OpenNi2Video’
nivid = new OpenNi2Video(stream_modes);
^

/home/qie/softs/ros_slam/Pangolin/src/video/drivers/openni2.cpp:660:79: error: invalid new-expression of abstract class type ‘pangolin::OpenNi2Video’
nivid = new OpenNi2Video(default_dim, default_roi, default_fps);
^

В настоящее время я пишу 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

Понравилась статья? Поделить с друзьями:
  • Error invalid magic number ubuntu
  • Error invalid magic number error you need to load the kernel first
  • Error invalid magic number error please load the kernel first
  • Error invalid login при обновлении joomla 3
  • Error invalid license environment application closing