首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示功能不起作用

显示功能不起作用
EN

Stack Overflow用户
提问于 2013-01-31 21:56:17
回答 2查看 72关注 0票数 0

我有三节课。

代码语言:javascript
复制
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;

    }

在main中,我有以下内容:

代码语言:javascript
复制
piesa_c C(2, H,14,"TIPC",20);


C.afisare();

但这不管用。我不知道是否正确声明了"buf“,因为问题似乎出现在最后一节课上。为什么?

稍后的编辑:完整的代码在这里:http://pastebin.com/nx2FGSfe

现在,我在main中有这个

代码语言:javascript
复制
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;
}

display函数返回此错误

代码语言:javascript
复制
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*’
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-31 21:59:02

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

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

代码语言:javascript
复制
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中的每个元素上调用成员函数

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

如果afisare()不修改,则将其设为const:

代码语言:javascript
复制
void afisare() const
{
}

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-31 21:58:45

我不确定“不工作”在这个上下文中是什么意思,但是当你调用这个构造函数时:

代码语言:javascript
复制
piesa_c C(2, H,14,"TIPC",20);

未设置数据成员nr。它可以有任何适合int的值,所以当你使用它初始化一个数组时,你会得到一个变量和奇怪的结果。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14627467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档