首先,我想使用方法Probka
扩展abstarct类Przetworz
以对矢量对象进行一些操作Probka
代码:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;
class Probka
{
public:
double t, w;
Probka(double t,double w)
{
this->t = t;
this->w = w;
}
virtual vector<Probka*> Przetworz(const vector<Probka*> &probka) = 0;
};
class Dodaj :public Probka
{
private:
double wartoscdodawana;
public:
Dodaj(double przes):Probka(t,w)
{
this->wartoscdodawana = przes;
}
virtual vector<Probka*> Przetworz(const vector<Probka*> &probka)
{
vector<Probka*> wynik;
for (vector<Probka*>::const_iterator it = probka.begin() ; it != probka.end(); ++it)
{
//&Probka( (*it)->t ,(*it)->t + this->wartoscdodawana );
wynik.push_back(Probka( (*it)->t ,(*it)->t + this->wartoscdodawana ));
}
return wynik;
}
};
int main(int argc, char *argv[])
{
if ( argc < 5)
{
std::cout << "Za malo argumentow";
exit(0);
}
string plik1;
string plik2;
//tablica probek
std::vector < Probka* > TablicaProbek;
for (int i = 1; i < argc; i++)
{
if (i + 1 != argc)
{
if (strcmp(argv[i],"-i") == 0)
{
plik1 = argv[i + 1];
//vector probek
std::fstream plik;
plik.open( plik1, std::ios::in );
if( plik.good() == true )
{
string linia;
while(!plik.eof())
{
getline(plik,linia);
stringstream ssin(linia); //dzielenie po spacji
double t = 0; //czas
double w = 0; //wartosc
ssin >> t;
ssin >> w;
//Probka tymczasowa(t,w);
//TablicaProbek.push_back(tymczasowa); //wrzucanie do vectora probek
}
}
plik.close();
}
else if (strcmp(argv[i],"-o") == 0)
{
plik2 = argv[i + 1];
}
}
}
system("pause");
return 0;
}
问题:
error C2259: 'Probka' : cannot instantiate abstract class
第45行。
我做错了什么?
也许我的推理是错的?
答案 0 :(得分:1)
您的Probka
类是一个抽象类。在c ++中,你不能从这样的类实例化,这种类用作接口。
接口类是一种DIP机制,通过仅共享公共接口将程序的其他部分与某个类分开。
您必须在所有地方使用Probka*
或不使其抽象。
PS:
如果您至少在function=0
,那么您的课程就会变得抽象。
关于您的代码:
你有一些错误。
<强>第一强>:
`Dodaj(double przes):Probka(t,w)`
你不能将Probka
的属性作为其初始变量传递!!我不知道您打算做什么,但您可能需要将t
和w
作为Dodaj
的构造函数参数。
<强>第二强>:
wynik.push_back(Probka( (*it)->t ,(*it)->t + this->wartoscdodawana ));
wynik
持有Probka*
,我认为您需要在此处创建Dodaj
并传递其地址。
第三次 :(感谢@PaulMcKenzie,他在评论中提到)
您的基类缺少虚拟析构函数。因此,如果delete
通过Dodaj
指针动态分配Probka
对象,则行为不明确。所以你需要:
virtual ~Probka(){/*...*/};