如何在 c++ 中使用虚拟类从其他类调用方法
How to use virtual class in c++ to call method from other class?
我正在尝试使用虚拟类从另一个类中的一个类调用方法。我尝试了几种实例化虚拟类的方法,但总是出现一些错误,我做错了什么?这是三个代码片段。
我正在尝试使用虚拟类 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);
...
在另一个类中选择.cpp
.....
SimData* dat;
dat->onSimUpdate(value1); --->HERE IS THE ERROR THAT IT IS NOT INITIALIZED
.....
你知道我如何在 Select.cpp 文件中正确调用抽象类吗?
谢谢。
你有一个指向SimData
的指针。您需要使其指向一个实例。例如
SimData* dat;
maintask m;
dat = &m; // dat now points to m
dat->onSimUpdate(value1); // OK now
请注意,调用 new maintask()
将生成指向可分配给 dat
的maintask
的指针。我没有使用过这个例子,因为动态分配和通过指针的多态性是两个独立的问题。此外,处理原始new
指针充满了危险。
下面是一个更现实的例子,仍然没有动态分配,甚至没有指针:
void foo(SimData& data, int x) { dat.onSimUpdate(x); }
maintask m;
foo(m, 42);
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!
使用智能指针代替原始指针:
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
一起使用,哪些不应该?
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 如何从其他类n个Qt C++调用QTimer?
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 没有头文件如何使用c ++调用其他模块中的函数?
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- 在其他线程中循环访问该concurrent_vector时调用 concurrency::concurrent_vect
- 推断大多数模板对象的参数,但在调用模板函数时对其他对象显式
- 如何引用或调用在 c++ 中的其他 while 循环中创建的向量?
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- 获取对源文件中特定函数的所有调用并生成其他文件(使用 C、C++预处理器或脚本)
- 如何在其他一个C 之前调用函数而不将其初始化
- 如果从在其他函数中调用的函数引发异常会发生什么情况
- 在其他构造函数的调用中调用构造函数时C++编译错误
- 将 2D 数组设置为函数,并根据需要在其他地方调用它
- 在递归功能中,我如何跳到堆栈上的其他功能调用
- CryptoAPI RSA: CryptDecrypt只在第一次解密,其他调用返回NTE_BAD_DATA