0

私は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*’
4

2 に答える 2

3

nrコンストラクターで初期化されないpiesa_c()ため、未定義の値になります。

動的に割り当てられた配列を使用するstd::vector<piesa_b>代わりに、代わりに a を使用しました。piesa_c動的メモリ割り当てを処理し、 のインスタンスがコピーされたときに正しいことを行います。Using std::vectoralso は、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()変更しない場合は、const にします。

void afisare() const
{
}

std::stringさらに、の代わりに使用しchar*ます。クラスにメンバーを動的に割り当てる必要がある場合は、3 の規則に従う必要があります。

于 2013-01-31T13:59:01.553 に答える
2

このコンテキストで「機能しない」が何を意味するのかはわかりませんが、このコンストラクターを呼び出すと、次のようになります。

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

データ メンバnrが設定されていません。int に収まる任意の値を持つことができるため、これを使用して配列を初期化すると、可変で奇妙な結果が得られます。

動的に割り当てられた配列 and の代わりにstd::vectorandを使用することで、多くの問題を回避できることに注意してください。std::stringchar*

于 2013-01-31T13:58:44.940 に答える