c ++中代理模式的问题

时间:2017-11-01 06:40:49

标签: c++

我被告知在我的程序中使用代理模式,这对我来说并不是那么清楚。

我遇到Proxy &operator*()的一些问题,我不知道应该返回哪里来获取文件中当前索引的值。

我以前有这个并且它有效:

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

但我被告知要将其更改为Proxy

如果我使用Proxy &operator*()进行编译,那么我就

  

错误:类型' IntFile :: Proxy&'的引用无效初始化   来自类型' 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;
}

2 个答案:

答案 0 :(得分:1)

返回代理需要您返回代理对象。您尝试返回对此类对象的引用,但它不会退出。我们不能将代理引用绑定到整数。

修复很简单,只需按值返回一个新对象:

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

答案 1 :(得分:0)

试试这个

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

它可以避免您创建另一个新的代理