无法将类对象强制转换为指针向量
Can't cast class object to vector of pointners
首先,我想扩展一个抽象类Probka
,用方法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。我做错了什么?也许我的推理是错的?
您的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,正如他在评论中提到的)
基类缺少虚析构函数。因此,如果您通过Probka
指针delete
动态分配Dodaj
对象,行为是不清楚的。所以你需要:
virtual ~Probka(){/*...*/};
相关文章:
- 转换指针引用的字符串
- 无法向上转换指针到指针参数
- 混合转换指针和引用
- 堆栈对象的强制转换指针
- 基类到派生模板类的强制转换指针,而不知道类型
- 删除类型转换指针的最佳方法
- 管理到本机值类转换:强制转换指针是否安全?
- 转换指针类型
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 当我们递增下面的类型转换指针时会发生什么?
- 类型强制转换指针构造函数调用
- 如何转换(指针向量)-->(指向指针数组的指针)
- 如何从类功能转换指针
- 在C++对象中:我应该使用父类强制转换指针,还是应该使用实际类本身进行强制转换
- Delphi中的类型转换指针添加
- C++分段错误(核心转储)错误 - 强制转换指针/将函数值返回到线程
- 以C++和运算符优先级键入指向数组成员的强制转换指针
- C++动态强制转换指针的内存清理
- 转换指针和引用的好处
- 在c++中转换指针