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

Adding functionality to a c++ class without inheritance

本文关键字:c++ 添加 功能 情况下 继承      更新时间:2023-10-16

我需要一个缓冲类。我发现"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;到std::ostream,所以我真的希望它能起作用,但我错了。

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

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

非常感谢。

如果不从类中派生一个新类,就无法向类中添加新方法。定义一个独立的辅助函数是正确的,但调用方法错误:

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

尝试append(buff1, buff2)

不能声明类的新函数,但可以创建一个函数来包装所需的行为。

我假设您不想只使用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;

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

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

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

 append( buf1, buf2 );

考虑包装而不是继承。

因此:

class Buffer
{
public:
    // ...
    void append( const Buffer& iOther );
private:
    std::vector<char> m_Data;
};

C++有一种定义全局运算符的方法,这样您就可以添加一个+=运算符或一个<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]);
}   
}

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