2011-05-30 63 views
0

main功能與 「刪除」 關鍵字

string reader_txt = "Readers.txt"; 
string book_txt = "Books.txt"; 

Reader * obj[10]; 

// *********** Reading Reader.txt 

ifstream reader_input; 
reader_input.open(reader_txt.c_str()); // open file 

string reader_name; 
string reader_category; 
int reader_n_category; 
int counter=0; 

if(reader_input.is_open()) 
{ 
    while(getline(reader_input, reader_name, '\n') && getline(reader_input, reader_category, '\n')) 
    { 
     reader_n_category = atoi(reader_category.c_str()); 

     switch(reader_n_category) 
     { 
     case FANTASY: 
      obj[counter++] = new fantasyReader(reader_name); 
      break; 
     case MYSTERY: 
      obj[counter++] = new mysteryReader(reader_name); 
      break; 
     case HORROR: 
      obj[counter++] = new horrorReader(reader_name); 
      break; 
     case SCIENCE: 
      obj[counter++] = new scienceReader(reader_name); 
      break; 
     } 
    } 
} 
else 
    cout<<"Cannot open up the Readers.txt"<<endl; 

reader_input.close(); // close file 

reader問題是基類
fantasyReaderhorrorReadermysteryReaderscienceReader被派生的類。

截至main末我把:

for(int pos=0; pos < counter; pos++) 
{ 
    delete obj[pos]; // compiling error, I don't know why 
} 

我得到一個編譯錯誤:

main.obj : error LNK2019: unresolved external symbol "public: __thiscall Reader::~Reader(void)" ([email protected]@[email protected]) referenced in function "public: void * __thiscall Reader::'scalar deleting destructor'(unsigned int)" ([email protected]@[email protected])

這是行不通的。我該怎麼寫或在哪裏寫delete聲明?

+0

除了特定的編譯器錯誤,我們能否看到讀者類的聲明? – 2011-05-30 22:51:18

+1

@Will A:由於'cout <<','ifstream'和'string',它必須是C++文件。 – 2011-05-30 22:52:17

+0

請發佈整個程序。無法知道錯誤是否是例如在Reader類中,因爲我們看不到源代碼。出於同樣的原因,還請引用編譯器給出的錯誤信息。 – 2011-05-30 22:53:11

回答

0

這不是重要的刪除語句。你是否將派生類定義爲虛擬類?或者,至少你是否聲明瞭析構函數是虛擬的?

+0

你的意思是虛擬的〜Reader()? – newb 2011-05-30 23:04:25

+0

邁克爾,我沒有看到虛擬繼承與此有關。 – 2011-05-30 23:12:02

+0

是的,我的意思是。其次,如果沒有虛擬析構函數,將出現類似的鏈接器錯誤。 – GMichael 2011-05-30 23:31:01

1

Reader基類需要有一個公共虛擬析構函數。可能還有其他問題,但這是我可以從發佈的不完整代碼中收集的。

+0

缺少'virtual'析構函數會導致UB,但不會出現編譯錯誤。缺少一個「公共」析構函數(爲此,你必須明確寫一個'private'或'protected')可能會導致錯誤。 – 2011-05-30 22:54:30

2

這是一個鏈接錯誤,而不是編譯器錯誤。

你忘了爲Reader的析構函數定義一個實現。

+0

編譯和鏈接罷工再次流行混亂! – 2011-05-30 22:59:08

3

這不是一個編譯時錯誤,而是一個鏈接錯誤。您已聲明Reader的析構函數,但未實現它。你一定要實現Reader析構函數,即使它是一個純粹的虛擬的,就像這樣:

class Reader { 
public: 
    virtual ~Reader() = 0; 
}; 

Reader::~Reader() {} 

還記得(如果你還沒有做到的話),一個基類必須始終它的析構函數設置爲virtual