class OGraph {
public:
OGraph() { }
virtual ~OGraph();
virtual bool is_directed()=0;
};
class OUGraph : public OGraph {
public:
OUGraph() { }
bool is_directed() { return false; }
~OUGraph() {}
};
但是当我这样做时
OUGraph myGraph();
cout << myGraph.is_directed();
我收到以下错误:
未定义的符号:“typeinfo for OGraph“,引自: 用于OUGraphin main.o的“vinfo for OGraph”,引用自: 在main.o中的OGraph :: OGraph()mkdir -p dist / Debug / GNU-MacOSX“OGraph :: ~OGraph()”,引用自: g ++ -o DIST /调试/ GNU-MacOSX的/ opengraph 构建/调试/ GNU-的MacOSX / OGraph.o 构建/调试/ GNU-的MacOSX / main.o
OUGraph :: ~OUGraph()在main.o中 OUGraph :: ~OUGraph()in main.o ld:symbol(s)not found collect2:ld 返回1退出状态make [2]: * [测距/调试/ GNU-MacOSX的/ opengraph] 错误1 make [1]: [.build-conf] 错误2使:* * [.build-impl]错误 2BUILD FAILED(退出值2,总计 时间:568毫秒)
答案 0 :(得分:4)
此:
OUGraph myGraph();
声明一个名为myGraph
的函数,它返回OUGraph
。你需要改为:
OUGraph myGraph;
这会声明一个变量,如你所愿。
答案 1 :(得分:2)
所有新的C ++人都属于同样的老事。
OUGraph myGraph();
你没有创建一个名为myGraph的变量,你已经声明了一个名为myGraph的函数,它返回一个OUGraph。删除“()”。
你似乎也从未在任何地方定义过你的基础析构函数。即使它是空的,你也需要定义它,因为你在类定义中声明了它。
答案 2 :(得分:1)
您没有为virtual ~OGraph();
提供任何实施。提供一个实现,用= 0;
将其指定为纯虚拟,或者只是去除它。
编译器期望将类的类型信息附加到其第一个虚方法的实现。您的第一个虚方法是未定义的,因此永远不会生成实现,并且您会收到相关的链接错误。
此外,正如大家所说,您应该从myGraph
的定义中删除括号。
答案 3 :(得分:0)
如果你使用'default'构造函数构建一个新对象,我相信你在没有空括号的情况下调用它。
因此,您可以使用OUGraph myGraph
而不是OUGraph myGraph()