2013-05-17 77 views
0

我的老師讓我做最後的作業。我需要在C++中列出一些東西(無法使用boost,STL等)。我的東西類必須在List類之後定義。小樣本是我的嘗試:轉發聲明和刪除

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

class Stuff; 

class List 
{ 
    private : 

     Stuff *s; 
     int n; 

    public : 

     List(int n) 
     { 
      this->n = n; 
      s = new Stuff[n]; 
     } 

     ~List() 
     { 
      delete[] s; 
      s = NULL; 
      n = 0; 
     } 

}; 

class Stuff 
{ 
    private : 

     string name; 
     double price; 

    public : 

     Stuff(){} 
}; 

int main(int argc, char **argv) 
{ 
    return 0; 
} 

我知道,那:

「如果被刪除的對象具有不完整的類類型在 刪除的點和完整的類有一個不平凡的析構函數或一個 解除分配函數,行爲是未定義的。「

但是我怎麼做呢?有任何想法嗎?記住,我不能使用boost,STL等。而Stuff類必須在List類之後定義。我只是不知道...

+1

這很荒謬。教師在編寫C++時如何禁止使用C++標準庫?要求他們編寫一個打印「Hello World」的程序,而不使用像「System。*」等標準Java程序包,JNI也是不允許的。 – 2013-05-17 17:29:57

+0

gcc不會編譯此代碼,原因與您在報價中提到的內容類似。 –

+0

「Stuff類必須在List類之後定義」。這是<我們老師的要求還是你認爲它應該是這樣? – jrok

回答

3

要使此代碼正常工作,您需要在定義List類構造函數和析構函數之前定義Stuff

所以:

class Stuff; 

class List 
{ 
    private : 

     Stuff *s; 
     int n; 

    public : 
     List(int n); 
     ~List(); 

}; 

class Stuff 
{ 
    private : 

     string name; 
     double price; 

    public : 

     Stuff(){} 
}; 

List::~List() 
{ 
    delete[] s; 
    s = NULL; 
    n = 0; 
} 
List::List(int n) 
{ 
    this->n = n; 
    s = new Stuff[n]; 
} 
+0

顯然,要求是課堂材料必須在課程列表後定義。 –

+0

這是我的例子。類的構造函數和析構函數不是。但除非我們想要的代碼不能編譯或者更復雜,否則我看不到合理的解決方案。我認爲期望學生以改變語言工作方式的方式重寫編譯器是不合理的。對於'新東西[n]'工作,'Stuff'必須是一個完全定義的類。 –

+0

謝謝。我想我會按照你的建議來做,非常感謝!:) –

1

如果您有class Stuff;替換它與實際實施的代碼。 class Stuff;是一個前向聲明,這意味着你可以參考class Stuff但你不能使用它。

這裏有兩個解決方案:


class Stuff { 
private : 
    string name; 
    double price; 
public : 
    Stuff(){} 
}; 

class List 
{ 
private : 
    Stuff *s; 
    int n; 
public : 
    List(int n) { 
     this->n = n; 
     s = new Stuff[n]; 
    } 
    ~List() { 
     delete[] s; 
     s = NULL; 
     n = 0; 
    } 
}; 

class Stuff; 

class List 
{ 
private : 
    Stuff *s; 
    int n; 
public : 
    List(int n); 
    ~List(); 
} 

class Stuff { 
private : 
    string name; 
    double price; 
public : 
    Stuff(){} 
}; 

List::List(int n) { 
    this->n = n; 
    s = new Stuff[n]; 
} 
List::~List() { 
    delete[] s; 
    s = NULL; 
    n = 0; 
} 
2

你必須把List聲明的標題,並將執行到一個源文件,其中Stuff定義可用(#include "Stuff.h" ),你可以刪除Stuff

或者您也可以在同一個文件中執行List,但是在Stuff聲明之後,編譯器實際上知道要刪除什麼

1

將聲明與實現分開。雖然你不能使用boost等,你可以使用單獨的頭文件和源文件。

List類的定義放入list.hh中,在stuff.hh中定義類Stuff。在類List(在list.hh中)的定義中,聲明但不定義那些需要知道類Stuff的成員函數。將這些函數定義放在源文件list.cpp中。這個源文件將#include list.hh和stuff.hh。

2

什麼模板?

template<class T> 
class List 
{ 
private : 

    T *s; 
    int n; 

public : 

    List(int n) 
    { 
     this->n = n; 
     s = new T[n]; 
    } 

    ~List() 
    { 
     delete[] s; 
     s = NULL; 
     n = 0; 
    } 
}; 

class Stuff 
{ 
private : 

    string name; 
    double price; 

public : 

    Stuff(){} 
    ~Stuff(){} 
}; 


int main(int argc, char **argv) 
{ 
    List<Stuff> list(4); 
    return 0; 
} 
+0

沒辦法,不能使用它們;) –

+0

@brian我喜歡這個遊戲!每個人都試圖猜測你想要什麼,而你只是不斷說出來!這很有趣,我沒有別的事情要做。 –