我无法显示数组中包含的不同类型的变量

时间:2013-01-31 16:50:00

标签: c++

我必须为大学做一个计划。

我在问题陈述中已经声明了3个类。 头等舱:

class piesa_a{
    protected:        
        int id;
        char *tip;
        int pret;
};

第二课:

class piesa_b:public piesa_a
{    
    private:
        float lungime;
        bool bw;
};

第三课:

class piesa_c:public piesa_a
{    
    private:
        int nr;
        piesa_b *buf;
};

在main中我需要创建一个数组,用于存储piesa_a,piesa_b,piesa_c等项目。然后我必须按价格对物品进行分类。

到目前为止我有这段代码: http://pastebin.com/nx2FGSfe

程序不完整,因为它不会显示数组中的每个项目。

我被困在这里。但是如果你在它们之外显示数组的元素,它就会起作用。

简短:第143行出错,我想解决。

main.cpp:143:18: error: request for member ‘afisare’ in ‘*(v + ((unsigned int)(((unsigned int)i) * 4u)))’, which is of non-class type ‘piesa_a*’

代码在这里:

#include <cstdlib>
#include<iostream>
#include<string.h>
using namespace std;

class piesa_a{     
    protected:       
        int id;
        char *tip;
        int pret;

    public:
        piesa_a()
        {
            id = 0;
            tip = new char[1];
            pret = 0;
        }

        piesa_a(int aidi, char *typ, int pretz)
        {     
            id = aidi;
            tip = new char[strlen(typ)+1];
            strcpy(tip,typ);
            pret = pretz;     
        }

        piesa_a&operator =(piesa_a alta)
        {
            id = alta.id;
            tip = new char[strlen(alta.tip)+1];
            strcpy(tip,alta.tip);
            pret = alta.pret;

            return *this;
        }

        virtual void afisare()
        {
            cout<<"\n Piesa A: "<<id<<" "<<tip<<" "<<pret;
        }     
};

class piesa_b:public piesa_a
{

private:
    float lungime;
    bool bw;
public:
    piesa_b():piesa_a(){lungime = 0;bw = 0;}
    piesa_b(float lg,bool bl, int aid, char *tipi, int pretzz):piesa_a(aid,tipi,pretzz)
    {
        lungime = lg;
        bw = bl;
    }
    piesa_b&operator =(piesa_b &c)
    {
        id = c.id;
        tip = new char[strlen(c.tip)+1];
        strcpy(tip,c.tip);
        pret = c.pret;
        lungime = c.lungime;
        bw = c.bw;

        return *this;
    }

    void afisare()
    {
        piesa_a::afisare();
        cout<<"impreuna cu piesa B: "<<lungime<<" "<<bw<<"\n";
    }

};

class piesa_c:public piesa_a
{     
    private:
        int nr;
        piesa_b *buf;
    public:
        piesa_c():piesa_a(){nr=0; buf = new piesa_b[nr];}
        piesa_c(int n, piesa_b *bu,int aid, char *tipi, int pretzz):piesa_a(aid,tipi,pretzz)
        {
            nr = n;
            buf = new piesa_b[nr];
            for(int i=0;i<nr;i++)
                buf[i]= bu[i];
        }

        piesa_c&operator =(piesa_c &alta)
        {       
            id = alta.id;
            tip = new char[strlen(alta.tip)+1];
            strcpy(tip,alta.tip);
            pret = alta.pret;
            nr = alta.nr;
            for(int i=0;i<alta.nr;i++)
                buf[i] = alta.buf[i];           
        }

        void afisare()
        {                       
            for(int i=0;i<nr;i++)
                buf[i].afisare();           
        }       
};

int main(int argc, char** argv) {       
    piesa_b *H;
    H = new piesa_b[2];

    piesa_a A(4,"TIPA",120);
    piesa_b B(100,1,3,"TIPA",120);
    H[0]=B;
    H[1]=B;
    piesa_c C(2, H,14,"TIPC",20);

    piesa_a** v = new piesa_a*[3];

    v[0] = &A;
    v[1] = &B;
    v[2] = &C;

    for(int i=0;i<3;i++)
        v[i].afisare();

    return 0;
}

出了什么问题?

1 个答案:

答案 0 :(得分:0)

在C ++(和当前的C)中,强制转换几乎总是标志着程序员不知道如何使用该语言,因为它应该被使用。如果你需要一个由3种类型的数据组成的数组,那么最干净的解决方案是一个基于3的类的对象数组。如果你想以不同的方式显示每个项目,你需要重载{{1}运算符,所以你只需遍历数组并在每个项目上运行<<。按价格排序意味着该类包含价格字段,您使用标准模板库中的排序,通过仅比较价格的比较操作。