在编译下面的c ++代码时,我收到以下错误消息:
"抽象类类型的新表达式无效' TrainerClass'因为函数'虚拟void TrainerClass :: AddItems()'纯粹属于' TrainerClass'"。
此代码的目的是初始化一些" stuff"等于训练者数量的对象(int nbrtrainer = 2;)。在这个例子中,2" stuff"应该创建对象:stuff [0]和stuff [1](指向' TrainerClass'类的指针)。然后,每个"内部的东西"对象应该通过指向' BagClass'来定义。上课"东西"对象。
这里的困难在于' TrainerClass' class包含一个纯虚函数,可以防止像往常一样初始化类对象。
使用动态绑定概念初始化从虚拟类派生的对象的正确语法是什么? (所有对象都应该被称为' 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;
}
答案 0 :(得分:0)
您的TrainerClass
有一个纯虚拟(= 0)函数AddItems()
。这可以防止您实例化此类的任何对象。不幸的是,您尝试在for循环中执行此操作,这会导致错误。
注意如果它可以工作,它将是未定义的行为,因为你从未初始化指针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);
//
...
这里是online demo。
这是一个更加动态的版本:
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();
下一个改进是使用智能指针而不是原始指针; - )