显示功能不起作用

The display function does not work

本文关键字:不起作用 功能 显示      更新时间:2023-10-16

我有3个类。

class piesa_a{
protected:
    int id;
    char *tip;
    int pret;
public:
[custructor with/without param, display function - works well each one of it]


class piesa_b:public piesa_a
{
private:
    float lungime;
    bool bw;
public:
[custructor with/without param, display function - works well each one of it]
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) 
        {
            buf = new piesa_b[nr];
            for(int i=0;i<nr;i++)
                buf[i]= bu[i];
        }
    void afisare()
    {
        cout<<nr;
    }

总的来说,我有这个:

piesa_c C(2, H,14,"TIPC",20);

C.afisare();

但这行不通。我不知道"buf"是否正确声明,因为问题似乎在最后一堂课上。为什么?

后期编辑:整个代码在这里:http://pastebin.com/nx2FGSfe。

现在,我主要有这个

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;
}

显示函数返回此错误

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

piesa_c() 构造函数中初始化,这意味着它将具有未定义的值。

不使用动态分配的数组,而是使用std::vector<piesa_b>。它将处理动态内存分配,并在复制piesa_c实例时执行正确的操作。使用 std::vector 还意味着可以省略 nr 成员变量,因为可以从vector::size()获取信息,并且可以在初始值设定项列表中而不是在构造函数主体中填充std::vector

std::vector<piesa_b> buf;
piesa_c(int      n,
        piesa_b *bu,
        int      aid,
        char*    tipi,
        int pretzz) : piesa_a(aid,tipi,pretzz),
                      buf(bu, bu + nr) {}

并在buf中的每个元素上调用成员函数:

// C++11 lambda, otherwise use
// std::vector<piesa_b>::const_iterator.
//
std::for_each(buf.begin(), buf.end(), [](piesa_b& pb) { pb.afisare(); });

如果afisare()不修改,则使其为:

void afisare() const
{
}

此外,使用 std::string 而不是 char* 。如果你坚持在类中动态分配成员,你需要遵守三规则。

我不确定在这种情况下"不起作用"是什么意思,但是当您调用此构造函数时:

piesa_c C(2, H,14,"TIPC",20);

未设置数据成员nr。它可以具有适合 int 的任何值,因此当您使用它来初始化数组时,您将获得变量和奇怪的结果。

请注意,通过使用 std::vectorstd::string 而不是动态分配的数组和char*,您可以省去很多麻烦。