无法将类对象转换为指向者的向量

时间:2015-05-17 19:13:46

标签: c++ visual-studio-2010 oop vector

首先,我想使用方法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行。 我做错了什么? 也许我的推理是错的?

1 个答案:

答案 0 :(得分:1)

您的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,他在评论中提到)

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

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