抽象类类型的新表达式无效
invalid new-expression of abstract class type
我目前正在为一个大学班级编写一个光线追踪器。为了从文件中加载场景,我编写了一个sdloader来读取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
来编译和链接所有
抽象类类型'box'的new-expression无效
错误信息没有什么不清楚的。您的类box
至少有一个成员没有实现,这意味着它是抽象的。不能实例化抽象类。
如果这是一个错误,通过实现丢失的成员来修复您的box类。
如果是设计的,则从box派生,实现缺少的成员并使用派生类
让其他人挠头,我遇到这个错误是因为我在基类中对方法的一个参数进行了不适当的const限定,因此派生类成员函数没有覆盖它。所以要确保没有像
这样的字符class Base
{
public:
virtual void foo(int a, const int b) = 0;
}
class D: public Base
{
public:
void foo(int a, int b){};
}
如果你使用c++ 11,你可以使用说明符"override",如果你没有正确覆盖抽象方法,它会给你一个编译错误。你可能有一个方法与基类中的抽象方法不完全匹配,所以你实际上没有重写它。
http://en.cppreference.com/w/cpp/language/override另一个可能导致未来谷歌人的原因
我有这个问题,因为我试图实现的方法需要一个std::unique_ptr<Queue>(myQueue)
作为参数,但Queue
类是抽象的。我通过使用QueuePtr(myQueue)
构造函数解决了这个问题,如下所示:
using QueuePtr = std::unique_ptr<Queue>;
并在参数列表中使用它。这修复了它,因为当您创建std::unique_ptr
的类型时,初始化器试图创建Queue
的副本,这是不可能发生的。
相关文章:
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 二进制表达式的操作数无效 - 使用 for 和迭代器
- 错误:参数中无效地使用了无效表达式
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- 二进制表达式 cout 问题的无效操作数
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- 在c++std::函数的上下文中无效使用void表达式
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 二进制表达式的操作数无效?
- 二进制表达式的操作数无效("常量字符*"和"常量字符*")
- 如何修复"二进制表达式的无效操作数"?
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 如何修复此错误:二进制表达式的操作数无效("std::vector<double>"和"double")?
- 正则表达式 & 无效的空指针表达式
- Regex表达式无效
- 使用 std::vector 时抽象类类型"Shape"的新表达式无效错误
- 在for循环的范围中,std::valarray的范围表达式无效
- 抽象类类型的新表达式无效
- 使用优先级队列时C++调试断言失败,表达式:无效堆