2013-11-27 43 views
0

我需要重載操作符[]和「=」爲包含文件爲文件中寫入到位置的類。 例如該代碼應工作:重載操作「=」並[]爲文件中的寫入到位置

UserFileClass File; 
    printf("%c",File[53]); //printing character from the 53 position in the file 
    File[34]='d'; //34th character in the file will be rewriten with d 

但如何做到這一點,如果超載[]返回一個char之後,我們不能覆蓋在「=」操作對象什麼。我試圖做的是,在其他的方式,但它並沒有太多的工作:

#include <iostream> 
    #include <fstream> 

    using namespace std; 

    class File 
    { 


fstream file; 
    char buffer; 
    int charPos; 
public: 

    File(string fileName); 
    ~File(){file.close();}; 

    File & operator[](int position); 
    File & operator=(const char &); 
    friend ostream & operator<<(ostream,File); 
}; 

File::File(string fileName) 
{ 
    file.open(fileName); 
    if(!file) 
    { 
     cerr<<"File reading error"; 
     exit(1); 
    } 
} 

ostream & operator<<(ostream outStream, File obj) 
{ 
    outStream<<obj.buffer; 
    return outStream; 
} 

File & File::operator[](int position) 
{ 
    file.seekg(position); 
    if(file.eof()) 
    { 
     buffer='\0'; 
    } 
    else 
    { 
     file.read(&buffer,1); 
     charPos=position; 
    } 
    return *this; 
} 

File & File::operator=(const char & charValue) 
{ 
    file.seekg(charPos); 
    file.write(&charValue,1); 
    return *this; 
} 

void main() 
{ 
    File userFile("file.txt"); 
    cout<<userFile[2]; 
    userFile[4]='a'; 
} 

編譯錯誤:錯誤2錯誤C2248:標準:: basic_ios < _Elem,_Traits> :: basic_ios:不能訪問私有成員..

+1

'的std :: ostream' ISN不可複製。 – chris

+0

'printf'是C,而不是C++。 –

+0

outStream << obj.buffer;在這裏,你正在訪問私有成員「緩衝」 ......寫一個getter緩衝區 – Nik

回答

0

通常的解決辦法是爲operator[]返回 代理,沿着線:

class UserFile 
{ 
    //... 
    char get(int index) const { ... } 
    void set(int index, char newValue) { ... } 
    class Proxy 
    { 
     UserFile* myOwner; 
     int myIndex; 
    public: 
     Proxy(UserFile* owner, int index) 
      : myOwner(owner) 
      , myIndex(index) 
     { 
     } 
     Proxy const& operator=(char ch) const 
     { 
      myOwner->set(myIndex, ch): 
      return *this; 
     } 
     operator char() const 
     { 
      return myOwner->get(myIndex); 
     } 
    }; 
    Proxy operator[](int index) 
    { 
     return Proxy(this, index); 
    } 
}; 

當然,在一個函數調用 匹配...時,這是不行的,所以你可以不要直接使用printf。 (不過, 真的沒有理由在C使用printf ++或具有可變參數的任何其他 功能。)你必須明確地 丟在char

printf("%c", static_cast<char>(file[42])); 
+0

您可以通過使用'seekg'和'read'做沒有代理,雖然。而且它不需要演員。 –

+0

@ZacHowland IIUC的目標是支持'[]'語法。如果沒有代理人,你會怎麼做呢? (而且因爲這是C++,但事實上,它不與'無縫工作printf'不是一個問題;它_does_與'的std :: ostream'工作) –

+0

如果這是他的目標,那麼這可能是一個XY問題。 'operator []'的行爲將根據方向而有很大不同(例如,'file [3] ='d''必須寫入文件,'cout << file [3]'必須讀它)。將整個文件加載到「字符串」並操作它將是一個更好的解決方案(至少它會減少所有的磁盤讀寫操作)。 –

0
ostream & operator<<(ostream outStream, File obj) 

該聲明是錯誤的。它應該是:

ostream& operator<<(ostream& outStream, File obj) 
        ^^^^^^^^ .................... Note the &  

此外,我根本沒有看到這個類的需要。這似乎是圍繞fstream的包裝,而是在做什麼,fstream尚不做的,並具有用它來引導。

附註:假設這個類是在一個頭文件中定義的,你可以做而不是想要在頭文件中放置一個using namespace std;