2009-11-21 78 views
1

說,我想如果該文件存在,或者如果該文件的內容是否有效或不創建一個文件類我應該如何處理C++中的不一致對象?

class File{ 
    public: 
      File(const char *file){ 
       openFile(file); 
      } 
      ~File(); 
      isEmpty(); 
}; 

中openFile檢查。

File *file = new File("filepath"); 
if(file) 
file->isEmpty(); 

,如果我的文件路徑是正確的,那麼所有的罰款,文件實例是正確的,我們可以調用file->isEmpty(); 什麼是文件不存在,在這種情況下仍然支票if(file)計算結果爲真,會導致創作文件實例實際上是無效的。我如何保證如果文件路徑無效,文件實例應該爲空。

回答

6

您的構造函數在文件無法打開的情況下應該拋出異常。

File::File(const char* pPath) 
{ 
    if (!openFile(pPath)) 
    throw FileNotFound(pPath); 
} 
+0

與此相聯繫,它也可能是有意義避免不必要的動態分配。 File對象是其中的一個,不需要** new **。 – UncleBens 2009-11-22 00:09:35

1

在構造函數中做類似檢查的唯一方法是引發異常。但是這並不是很好的設計 - 你應該創建它,檢查它是否有效,如果不是,刪除它。

+0

怎麼樣?你是建議一種工廠的東西 – pankajt 2009-11-21 22:26:30

+6

爲什麼不呢? 「C++編碼標準」指出,在構造函數中引發異常是在這些情況下應該做的。當然你必須確保所有的資源都被正確地解除分配,但就我所知,這與其他異常的使用沒有什麼不同。 – UncleZeiv 2009-11-21 22:35:57

+0

@Uncle,因爲錯誤的文件名不是「例外」。對於通過調用「isValid」方法輕鬆處理的內容,我寧願不承擔異常處理的開銷。 – 2009-11-21 23:28:51

1

我建議使用靜態工廠方法爲您檢查,如果對象無效,則刪除它並引發異常。如果我的理解是否正確,你想要什麼,從構造函數返回空值時"filepath"無效

File* file = File::open("whatever"); 
0

:你會創建這樣的文件嗎?這在C++中不是(直接)可能的,儘管存在一些可能性。你可以從你的構造函數中拋出一個異常,但是這會在C++中變得毛茸茸的。你可能有一些函數可以檢查File對象的有效性,所以if(file)將變成if(isValid(file))。如果要創建的文件無效,您也可以將某些此類邏輯包裝在某種工廠中,該工廠將返回null。

+6

爲什麼你說它可以得到毛茸茸的在構造函數中拋出異常?該語言強制如果從構造函數中拋出異常,對象的生命週期永遠不會開始。 – UncleZeiv 2009-11-21 22:36:37

0

我會使用STL模板並拋出一個空類。現在,你不能從構造函數返回任何東西......因此無論是做這樣的事情:

#include <string> 
using std::basic_string; 

class EmptyFile{}; 

template<typename T> 
    class File 
    { 
    public: 
     File(const basic_string<T> &FILE) 
     { 
      if (isEmpty(FILE)) throw EmptyFile(); 
      openFile(FILE); 
     } 
     bool isEmpty(const basic_string<T> &FILE) const 
      { return FILE.empty(); } 
    }; 

,或者你可以這樣做:

#include <string> 
using std::basic_string; 

template<typename T> 
class File 
{ 
public: 
    bool Open(const basic_string<T> &FILE) const 
    { 
     bool empty = isEmpty(FILE); 
     if(!empty) 
      /* open the file */; 
     return isEmpty; 
    } 
    bool isEmpty(const basic_string<T> &FILE) const 
    { return FILE.empty(); } 
}; 
相關問題