我正在尝试使用虚拟类从另一个类中的一个类调用方法。我尝试了几种实例化虚拟类的方法,但总是遇到一些错误,我做错了什么?这是三个代码片段。
我正在尝试使用虚拟类SimData.h:
#ifndef SIMDATA_H_
#define SIMDATA_H_
class SimData
{
public:
virtual void onSimUpdate(int id)=0;
};
#endif /* SIMDATA_H_ */
从maintask.h调用函数
...
class maintask : public SimData
{
public:
virtual void onSimUpdate(int id);
...
在另一个类Select.cpp
中.....
SimData* dat;
dat->onSimUpdate(value1); --->HERE IS THE ERROR THAT IT IS NOT INITIALIZED
.....
你知道我如何在Select.cpp文件中正确调用抽象类吗?
谢谢。
答案 0 :(得分:6)
你有一个指向SimData
的指针。你需要让它指向一个实例。例如,
SimData* dat;
maintask m;
dat = &m; // dat now points to m
dat->onSimUpdate(value1); // OK now
请注意,调用new maintask()
会产生指向maintask
的指针,您可以将其指定给dat
。我没有使用那个例子,因为通过指针的动态分配和多态是两个独立的问题。此外,处理原始new
ed指针充满了危险。
这是一个更现实的例子,仍然没有动态分配,甚至没有指针:
void foo(SimData& data, int x) { dat.onSimUpdate(x); }
maintask m;
foo(m, 42);
答案 1 :(得分:4)
SimData* dat;
dat->onSimUpdate(value1);
在上面的代码中,它与虚函数无关,而且与你从未初始化指针的事实有关(它指向永远不会落地)。您必须将其分配给某些内容:
SimData* dat = new maintask;
dat->onSimUpdate(value1); // this will now work
// NOTE: you need to delete dat at some point!
答案 2 :(得分:1)
使用智能指针代替原始指针:
std::unique_ptr<SimData> dat(new maintask());
dat->onSimUpdate(value1);
// deletion will happen automatically; no need to do it yourself
如果可用,请选择std::make_unique
(如果没有,请查看)。
与智能指针不同,原始指针有三个主要问题:
new
和delete
调用之间可能会发生异常。delete
一起使用,哪些不应该?