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
Доброго времени суток!
__________________
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 |
|||||||
Ни у одного из этих методов нет реализации.
Для класса Area не объявлен конструктор по умолчанию. Ну и там дальше вообще хрень какая-то! 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 |
Это реально исправить? Чтобы игра нормально работала. Конечно реально. Но для этого придется выучить 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