2013-08-06 160 views
1

我需要一個緩衝區類。我找到了「的std ::矢量」非常有用的,但我不喜歡,例如,要做到這一點:向繼承的C++類添加功能

typedef std::vector<char> Buffer; 
Buffer buff1; 
Buffer buff2; 
... 
buff1.insert(buff1.end(), buff2.begin(), buff2.end()) 

每次我要追加...我想有一些concat方法,如:

buff1.append(buff2) 

或運營商+ =或什麼。現在

,我試圖添加這個方法:

void append(dataStructures::Buffer& self, const dataStructures::Buffer& other) 
{ 
    self.insert(self.end(), other.begin(), other.end()); 
} 

,並通過簡單地叫它:buff1.append(buff2)但它不會編譯,對於原因:std::vector<byte, std::allocator<byte>>" has no member "append"。那是對的。我也試圖讓「自我」成爲一個指針,但沒有成功。它在將運算符< <添加到std :: ostream時確實有效,所以我真的認爲它可以工作,但我錯了。

我當然可以使用繼承機制創建一個Buffer,但std容器沒有虛擬Dtor,所以這可能是一個壞主意(儘管我沒有添加任何成員變量......仍然是一個壞主意)。

有沒有辦法做我想要的?我知道這只是一個可讀性問題,但它對我很重要。我想知道是否有一個簡單的解決方案,或者我唯一的選擇是實現一個代理類或一個全新的Buffer類(我嘗試過使用boost的Buffer,但它沒有分配內存,就像我理解的那樣)。

非常感謝。

+0

[Yakk](http://stackoverflow.com/users/1774667/yakk)[to the rescue](http://stackoverflow.com/a/16845998/420683)!雖然......嗯......我不知道我是否應該推薦這種方法。 – dyp

+0

我在嘗試谷歌解決方案時看到了這一點。很酷的是它非常複雜,但工作。關於這段代碼的其他方面都很糟糕......我仍然無法理解它。我正在尋找一段優雅的代碼,因爲我的意圖是儘可能讓我的代碼可讀(除了我真正需要快速運行的關鍵部分之外)。但無論如何,謝謝你,我想我可以從這個代碼學習:) –

回答

1

我在這裏假設你不想僅僅使用append(buff1, buff2)。你在做什麼可能在語言D中,但在C++中沒有。如果你真的想在C++中,即中間符號,這兩個操作數都在你的函數名的不同側面,你唯一的選擇是重載運算符,如:

void operator+=(dataStructures::Buffer& self, const dataStructures::Buffer& other) 
{ 
    self.insert(self.end(), other.begin(), other.end()); 
} 

然後你就可以作爲buff1 += buff2;

使用
2

嘗試append(buff1, buff2)

你不能聲明這個類的新函數,但你可以創建一個函數來包裝你想要的行爲。

6

如果不從中派生新類,則不能將新方法添加到類中。你在正確的軌道上通過定義一個獨立的輔助功能,但你調用了錯誤的方式:

//buff1.append(buff2) 
append(buff1, buff2) ; 
0

你將不得不創造一個全新的類,但用的組合物,而不是繼承:

class Buffer { 
public: 
    //...Constructor, Destructor, Assigment, Compound Assignment, Append methods, etc. 
protected: 
private: 
    std::vector<char> _data; 
}; 
0

它不工作,因爲你append功能的工作,如:

append(buf1, buf2); 

想想包裝而不是繼承。

所以:

class Buffer 
{ 
public: 
    // ... 

    void append(const Buffer& iOther); 

private: 
    std::vector<char> m_Data; 
}; 
0

C++有一種方法來定義全球運營商,這樣你可以添加一個+ =運算符或< <到一個std ::向量,如果你想。 下面是一個例子:

#include <vector> 
#include <stdlib.h> 
#include <stdio.h> 
template<typename T> 
void operator+=(std::vector<T>& a, const std::vector<T>& b) 
{ 
    a.insert(a.end(), b.begin(), b.end()); 
} 

int main() 
{ 
size_t i; 
std::vector<int> list1; 
std::vector<int> list2; 
for(i = 0; i < 3; ++i) 
{ 
    list1.push_back(rand()); 
} 

for(i = 0; i < 3; ++i) 
{ 
    list2.push_back(rand()); 
} 

for(i = 0; i < list1.size(); ++i) 
{ 
    printf("%d ", list1[i]); 
} 

printf("\n"); 
list1 += list2; 
for(i = 0; i < list1.size(); ++i) 
{ 
    printf("%d ", list1[i]); 
} 
} 

但是它可能會更好做一個輔助的功能,因爲它可能是更清晰了很多,你想用它做什麼,也許+ =並不意味着同樣的事情在每個人的心中