在没有继承的情况下向c ++类添加功能

时间:2013-08-06 18:35:38

标签: c++

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

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"。那是对的。我也尝试将“自我”作为指针,但没有成功。添加运算符&lt;&lt;&lt;&lt;&lt;&lt;到std :: ostream,所以我真的希望它能够工作,但我错了。

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

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

非常感谢。

6 个答案:

答案 0 :(得分:6)

如果没有从中派生新类,则无法向类中添加新方法。通过定义一个独立的帮助函数,你在正确的轨道上,但是你用错误的方式调用它:

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

答案 1 :(得分:2)

尝试append(buff1, buff2)

你不能声明类的新功能,但你可以创建一个包含你想要的行为的函数。

答案 2 :(得分: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;

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

它无效,因为您append的功能如下:

 append( buf1, buf2 );

考虑换行而不是继承。

所以:

class Buffer
{
public:
    // ...

    void append( const Buffer& iOther );

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

答案 5 :(得分:0)

C ++有一种定义全局运算符的方法,可以添加一个+ =运算符或一个&lt;&lt;如果你想要一个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]);
}   
}

然而,制作辅助函数可能更好,因为它可能更清楚你想用它做什么,也许+ =并不意味着每个人心中完全相同的东西