在没有继承的情况下向c++类添加功能
Adding functionality to a c++ class without inheritance
我需要一个缓冲类。我发现"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函数可能会更好,因为它可能更清楚你想用它做什么,也许+=在每个人的脑海中并不意味着完全相同的事情
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题