无法将类对象强制转换为指针向量

Can't cast class object to vector of pointners

本文关键字:转换 指针 向量 对象      更新时间:2023-10-16

首先,我想扩展一个抽象类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的属性作为它的初始变量!我不知道你打算做什么,但你可能需要得到tw作为Dodaj的构造函数参数。

第二:

wynik.push_back(Probka( (*it)->t ,(*it)->t + this->wartoscdodawana ));

作为wynik持有Probka*,我认为你需要在这里创建Dodaj并传递它们的地址。

第三:(感谢@PaulMcKenzie,正如他在评论中提到的)

基类缺少虚析构函数。因此,如果您通过Probka指针delete动态分配Dodaj对象,行为是不清楚的。所以你需要:

virtual ~Probka(){/*...*/};