簡體   English   中英

復合引用和分配的運算符重載

[英]Operator overload for compound dereference and assignment

使用C ++運算符重載,可以創建一個模擬指針類型的類,因此我正在嘗試使用這種方法抽象FILE讀取操作。

class FilePointer
{
    FILE* file;
    size_t position;
    FilePointer (FILE* file, size_t position)
    {
        this->file = file;
        this->position = position;
    };
    public:
    FilePointer (FILE* file)
    {
        this->file = file;
        this->position = 0;
    };
    FilePointer operator+ (size_t offset)
    {
        return FilePointer(file,position + offset);
    };
    FilePointer operator++ () // Prefix : ++FilePointer
    {
        position++;
        return *this;
    };
    FilePointer operator++ (int) // Postfix : FilePointer++
    {
        FilePointer before = *this;
        position++;
        return before;
    };
    FilePointer operator+= (size_t offset)
    {
        position += offset;
        return *this;
    };
    uint8_t operator* ()
    {
        fseek(file,position,SEEK_SET);
        Uint8 out;
        fread(&out,1,1,file);
        return out;
    };
    uint8_t operator[] (size_t offset)
    {
        return *(*this + offset);
    };

};

從上面的代碼片段中可以看出,我能夠找出如何區分增量運算符的變體,從而使給定FilePointer f; f++++f會表現得很直觀。

但是,如果我想使用此類進行文件寫入怎么辦? 目前,我可以抓取一個字節uint8_t something = f[0]; 並且它可以工作,但是如果我想“設置”某些東西,即f[0] = 100; ,則按原樣重載將無法解決此問題。

除了這是否是“良好實踐”(盡管也可以隨意考慮)之外,還有沒有辦法在類的運算符重載中實現此行為?

uint8_t n = f[0];
n++;
f[0] = n;

或者,變得更加幻想,像這樣:

f[1]++;

我想可以做到的一種方法是實現另一個表示“已取消引用的FilePointer”的類,但很好奇是否可以僅對FilePointer類本身進行重載。

我想可以做到的一種方法是實現另一個表示“已取消引用的FilePointer”的類

那幾乎是唯一的方法。 它可以是“代理類型”的對象,可以轉換為uint8_t (在這種情況下可能是隱式的,盡管通常我不喜歡隱式轉換),但也可以分配給它。

它必須使用FilePointer*構造,並且必須是friend以便它可以調用適當的“寫入”功能。

不過,這會有點麻煩,因為它可能很快變成“懸空的”,並在錯誤的位置書寫。 您也可以存儲在代理對象被創建時的當前位置,並尋求回到那個位置當且僅當需要在寫作的時候。 但是,所有尋求並不是很有效。

sloooooow也一次讀取一個字節。

總的來說,盡管您的嘗試令人欽佩,但我還是建議您不要采用這種方法。 你至少可以換FILE*在一個不錯的類,它fclose你,如果它超出范圍。

但是很好奇,是否有可能只處理FilePointer類本身的重載。

我不這么認為。 無論您從operator[]返回的內容是什么,都需要某種魔術狀態,該魔術狀態可以接受“設置”值並連接到FILE*機械。 返回uint8_t絕對不會讓您這樣做。

提高1個字符寫入性能的另一種方法可能是,代理文件指針實際上是一個緩沖區,該緩沖區以某種方式收集許多分配,然后在銷毀時將它們全部后台處理到文件中。

使用代理方法要注意的一件事是,調用者可以使用autoauto&保留許多代理對象,並嘗試無序更新它們。 我認為沒有解決此問題的有效方法。

另外, operator --呢? 盡管c ++庫確實具有單向迭代器的概念。 也許迭代器是更好的隱喻?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM