2013-01-31 88 views
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*’ 
+0

什麼是'H'?你必須更具描述性,*它如何不能「工作」?它看起來好像它不應該建立,但你不包括任何你不瞭解的編譯器輸出...... – unwind

+0

我沒有看到一個名字顯示在任何地方的函數...... – PlasmaHH

+0

@PlasmaHH它被稱爲'afisare ()':) –

回答

3

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*。如果您堅持要在課程中動態分配成員,您需要遵守rule of three

2

我不知道什麼是「不行」是指在這種情況下,但是當你調用這個構造:

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

數據成員nr未設置。它可以具有任何適合int的值,所以當你使用它來初始化一個數組時,你會得到變量和奇怪的結果。

請注意,您可以通過使用std::vectorstd::string,而不是動態分配數組和char*爲自己省下不少麻煩。

+0

是的,我的錯誤。 但我的目標是顯示buf [i]。我怎樣才能做到這一點? – kraYz

+0

解決方案:void afisare() { for(int i = 0; i kraYz

+0

@kraYz我會避免所有的原始指針,並使用'std :: vector'和'std :: string'。 – juanchopanza