使用动态绑定和纯虚类时,正确的语法是什么?
C++ What is the correct syntax when using dynamic binding and pure virtual class?
当编译下面的c++代码时,我得到以下错误消息:
"抽象类类型'TrainerClass'的新表达式无效,因为函数'virtual void TrainerClass::AddItems()'在'TrainerClass'中是纯的"。
这段代码的目的是初始化一些"stuff"对象,这些对象相当于trainer的数量(int nbrtrainer = 2;)。在这个例子中,应该创建2个"stuff"对象:stuff[0]和stuff[1](指向'TrainerClass'类的指针)。然后,每个"stuff"对象内部的内容应该通过将"BagClass"类指向"stuff"对象来定义。
这里的困难在于'TrainerClass'类包含一个纯虚函数,这阻止了像往常一样初始化类对象。
使用动态绑定概念初始化从虚拟类派生的对象的正确语法是什么?(所有对象都应该命名为'stuff[x]',并带索引)
#include <iostream>
using namespace std;
#define Training // to declare the global variable
///Definition of class Pocket
class pocket
{
public:
double volume;
};
///Definition of virtual class TrainerClass
class TrainerClass
{
public:
pocket *Space;
virtual void AddItems()=0;
};
///Definition of derived class
class BagClass: public TrainerClass
{
public:
double mass;
BagClass(double m2)
{
mass=m2;
}
void AddItems()
{
cout << "out virtual " << endl;
}
};
#ifdef Training
#define Training
TrainerClass **stuff=0;
#else
extern TrainerClass **stuff;
#endif
int main()
{
int nbrtrainer = 2;
TrainerClass **stuff;
for(int itrainer=0;itrainer<nbrtrainer;itrainer++) stuff[itrainer] = new TrainerClass;
stuff[0] = new BagClass(0.2);
stuff[1] = new BagClass(0.5);
stuff[0]->AddItems();
return 0;
}
您的TrainerClass
有一个纯虚(=0)函数AddItems()
。这将阻止您实例化该类的任何对象。不幸的是,您试图在for循环中这样做,这会导致错误。
stuff
(你只分配stuff元素)。这里有一个可以工作的变体,并且为了更方便使用#include <vector>
:
...
vector<TrainerClass*> stuff(nbrtrainer); // vector of the given dynamic size
//for(int itrainer=0;itrainer<nbrtrainer;itrainer++)
// stuff[itrainer] = new TrainerClass; // you can't instantiate an abstract class
stuff[0] = new BagClass(0.2); // this is a valid instantiation
stuff[1] = new BagClass(0.5);
//
...
这是在线演示。
这里有一个更动态的版本:
vector<TrainerClass*> stuff; // empty vector
stuff.push_back(new BagClass(0.2)); // just add a new eleemnt at the end of the vector
stuff.push_back(new BagClass(0.5));
for (int i=0; i<stuff.size(); i++)
stuff[i]->AddItems();
下一个改进是使用智能指针而不是原始指针;-)
相关文章:
- C++避免重复声明的语法是什么
- 使用基类指针调用基类的值构造函数的语法是什么?
- 这行/语法是什么意思?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 将引用绑定到指针的语法是什么?(各种)
- 这个typedef和转换运算符语法是什么意思
- 此语法是什么意思.(::*).
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 将此类传递给引用的正确语法是什么?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 在TensorFlow C++中用于feed_dict的语法是什么?
- 调用模板化类内的枚举类枚举器的正确语法是什么
- 返回没有 typedef 的成员函数指针的语法是什么?
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 这种增量语法是什么意思
- 返回结构的方法的正确语法是什么
- C 中的(*)语法是什么意思
- 堆栈(int = 10),这个语法是什么意思(C++)
- variadic模板阵列参考参数的语法是什么?