2017-11-01 8 views
0

自分のプログラムでプロキシパターンを使用するように言われましたが、それは私には分かりません。C++のプロキシパターンに関する問題

Proxy &operator*()にいくつかの問題がありますが、現在のインデックスの値を取得するためにファイルに戻す必要があるかどうかわかりません。

私は前にこれを持っていたし、それが働いた:

int &operator*() 
{ 
    return ptr->getValue(index); 
} 

をしかし、私はProxyにそれを変更するように言われました。

私はProxy &operator*()でコンパイルする場合、私は

error: invalid initialization of reference of type 'IntFile::Proxy&' from expression of type 'int'|

完全なコードを取得しています:プロキシを返す

#include <iostream> 
#include <cstdio> 
#include <vector> 

using namespace std; 

class IntFile 
{ 
public: 
    int value; 
    FILE* file; 

    IntFile() 
    { 
     file = fopen("text.txt", "r+b"); 
    } 

    ~IntFile() 
    { 
     fclose(file); 
    } 

    virtual int& getValue(int index) 
    { 
     fseek(file, 4*index, SEEK_SET); 
     fread(&value, 4, 1, file); 
     return value; 
    } 

    virtual int setValue(int value) 
    { 
     fseek(file, 0, SEEK_CUR); 
     fwrite(&value, 4, sizeof(value),file); 
     return 0; 
    } 

    class Proxy 
    { 
    private: 
     IntFile *ptr; 
     long index; 
    public: 
     Proxy(IntFile* ptr3) 
     { 
      ptr = ptr3; 
     } 
     Proxy& operator=(int value) 
     { 
      ptr->setValue(value); 
     } 
     operator int() const 
     { 
      return ptr->getValue(index); 
     } 
    }; 

    friend struct iterator; 
    struct iterator 
    { 
     int index; 
     int value2; 
     IntFile* ptr; 

     iterator(IntFile* ptr2, int idx, FILE* ptrfile) 
     { 
      ptr = ptr2; 
      index = idx; 
      fseek(ptrfile, 4*index, SEEK_SET); 
     } 

     bool operator==(const iterator&other) const 
     { 
      return index == other.index; 
     } 

     bool operator!=(const iterator&other) const 
     { 
      return index!=other.index; 
     } 

     Proxy &operator*() 
     { 
      // How to do that? 
     } 

     int &operator=(int value) 
     { 
      this->value2 = value; 
     } 

     iterator&operator++() 
     { 
      this->index = index+1; 
     } 

     iterator&operator--() 
     { 
      this->index = index -1; 
     } 
    }; 

    iterator begin() 
    { 
     return iterator(this, 0, file); 
    } 

    iterator end(int number) 
    { 
     return iterator(this, number, file); 
    } 

    iterator rbegin(int number) 
    { 
     return iterator(this, number-1, file); 
    } 

    iterator rend() 
    { 
     return iterator(this, -1, file); 
    } 
}; 

int main() 
{ 
    IntFile myfile; 

    int number; 
    cout << "Enter number of elements: " << endl; 
    cin >> number; 

    vector <int> myVector; 

    cout << "Enter your numbers: "; 
    for (int i = 0; i < number; i++) 
    { 
     cin >> myfile.value; 
     myVector.push_back(myfile.value); 
    } 

    fwrite(&myVector[0], sizeof(vector<int>::value_type), myVector.size(),myfile.file); 

    cout << endl << "FORWARD 1 by 1: " << endl; 
    for (IntFile::iterator i = myfile.begin(); i != myfile.end(number); ++i) 
    { 
     cout << *i << " "; 
    } 

    cout << endl << "BACKWARD 1 by 1: " << endl; 
    for (IntFile::iterator i = myfile.rbegin(number); i != myfile.rend(); --i) 
    { 
     cout << *i << " "; 
    } 

    cout << endl; 
    return 0; 
} 

答えて

1

は、プロキシオブジェクトを返すためにあなたのことが必要です。そのようなオブジェクトへの参照を返そうとしましたが、終了しません。また、プロキシ参照を整数にバインドすることはできません。

修正は簡単です、ただの値で新しいオブジェクトを返します。

Proxy operator*() 
{ 
    return Proxy(ptr); 
} 
+0

申し訳ありませんが、私は少し困惑しているが、私は、非const参照の今 無効な初期化のために、このエラーを取得していますタイプ 'IntFile :: Proxy *'の一時的な型から 'IntFile :: Proxy&'をタイプして下さい –

+0

@MeghanCristen - あなたは演算子の戻り値の型を変更しませんでした!私はそれをどのように書きましたかに注意してください – StoryTeller

+0

はい、私の悪いです。どうもありがとう! –

関連する問題