1

我需要一个缓冲区类。我发现“std::vector”非常有用,但我不喜欢这样做:

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

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

buff1.append(buff2)

或 operator+= 或其他东西。

现在,我尝试添加此方法:

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". 没错。我也尝试将“self”作为指针,但没有成功。将 operator<< 添加到 std::ostream 时它确实有效,所以我真的希望它可以工作,但我错了。

当然,我可以使用继承机制创建一个 Buffer,但是 std 容器没有虚拟 Dtor,所以这可能是个坏主意(尽管我没有添加任何成员变量……仍然是个坏主意)。

有什么办法可以做我想做的事吗?我知道这只是可读性的问题,但这对我来说很重要。我想知道是否有一个简单的解决方案,或者我唯一的选择是实现一个代理类或一个全新的 Buffer 类(我尝试使用 boost 的 Buffer,但它不分配内存,据我了解)。

非常感谢。

4

6 回答 6

6

如果不从中派生新类,就不能向类添加新方法。通过定义一个独立的辅助函数,您走在了正确的轨道上,但是您以错误的方式调用它:

//buff1.append(buff2) 
append(buff1, buff2) ;
于 2013-08-06T18:41:33.083 回答
2

尝试append(buff1, buff2)

您不能声明该类的新函数,但您可以创建一个包装您想要的行为的函数。

于 2013-08-06T18:41:27.057 回答
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;

于 2013-08-06T18:41:19.057 回答
0

您将不得不创建一个全新的类,但使用组合而不是继承:

class Buffer {
public:
    //...Constructor, Destructor, Assigment, Compound Assignment, Append methods, etc.
protected:
private:
    std::vector<char> _data;
};
于 2013-08-06T18:41:41.783 回答
0

它不起作用,因为您的append工作方式如下:

 append( buf1, buf2 );

考虑包装而不是继承。

所以 :

class Buffer
{
public:
    // ...

    void append( const Buffer& iOther );

private:
    std::vector<char> m_Data;
};
于 2013-08-06T18:42:47.537 回答
0

C++ 有一种定义全局运算符的方法,这样您可以根据需要将 += 运算符或 << 添加到 std::vector。这是一个例子:

#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]);
}   
}

然而,创建一个辅助函数可能会更好,因为它可能更清楚你想用它做什么,也许 += 在每个人的脑海中并不意味着完全相同的事情

于 2013-08-06T18:58:38.947 回答