
关于c++模板类<<运算符的重载方法
关于模版函数运算符重载的问题
·
一、关于c++类模版<<运算符重载的2种方法
自己实现vector容器时需要重载运算符<<,自己总结了以下2种方法
1.友元函数类外实现重载
代码如下(头文件Vector.h):
#pragma once
#include<iostream>
using namespace std;
template<typename T>
class Vector
{
public:
Vector(int size = 128);//构造函数
Vector(const Vector& object);//拷贝构造函数
int getLength();
T& operator[](int index);
Vector& operator=(const Vector& object);
template<typename T>
friend ostream& operator<<(ostream& os, Vector<T>& object);
~Vector();
private:
int m_len;
T* m_base;
};
(实现文件Vector.hpp):
#include "Vector.h"
template<typename T>
Vector<T>::Vector(int size)
{
if (size > 0)
{
m_len = size;
m_base = new T[size];
}
}
template<typename T>
Vector<T>::Vector(const Vector<T>& object)
{
this->m_len = object.m_len;
this->m_base = new T[m_len];
for (int i = 0; i < m_len; i++)
{
m_base[i] = object.m_base[i];
}
}
template<typename T>
int Vector<T>::getLength()
{
return m_len;
}
template<typename T>
T& Vector<T>::operator[](int index)
{
return m_base[index];
// TODO: 在此处插入 return 语句
}
template<typename T>
Vector<T>& Vector<T>::operator=(const Vector<T>& object)
{
if (m_base != NULL)
{
delete[] m_base;
m_base = NULL;
m_len = 0;
}
this->m_len = object.m_len;
this->m_base = new T[m_len];
for (int i = 0; i < m_len; i++)
{
m_base[i] = object.m_base[i];
}
return *this;
}
template<typename T>
Vector<T>::~Vector()
{
if (m_base != NULL)
{
delete[] m_base;
m_base = NULL;
m_len = 0;
}
}
template<typename T>
ostream& operator<<(ostream& os, Vector<T>& object)
{
for (int i = 0; i < object.m_len; i++)
{
os << object.m_base[i] << " ";
}
os << endl;
return os;
}
2.友元函数类内实现重载
代码如下(头文件Vector.h):
#pragma once
#include<iostream>
using namespace std;
template<typename T>
class Vector
{
public:
Vector(int size = 128);//构造函数
Vector(const Vector& object);//拷贝构造函数
int getLength();
T& operator[](int index);
Vector& operator=(const Vector& object);
template<typename T>
friend ostream& operator<<(ostream& os, Vector<T>& object)
{
for (int i = 0; i < object.m_len; i++)
{
os << object.m_base[i] << " ";
}
os << endl;
return os;
}
~Vector();
private:
int m_len;
T* m_base;
};
(实现文件Vector.hpp):
#include "Vector.h"
template<typename T>
Vector<T>::Vector(int size)
{
if (size > 0)
{
m_len = size;
m_base = new T[size];
}
}
template<typename T>
Vector<T>::Vector(const Vector<T>& object)
{
this->m_len = object.m_len;
this->m_base = new T[m_len];
for (int i = 0; i < m_len; i++)
{
m_base[i] = object.m_base[i];
}
}
template<typename T>
int Vector<T>::getLength()
{
return m_len;
}
template<typename T>
T& Vector<T>::operator[](int index)
{
return m_base[index];
// TODO: 在此处插入 return 语句
}
template<typename T>
Vector<T>& Vector<T>::operator=(const Vector<T>& object)
{
if (m_base != NULL)
{
delete[] m_base;
m_base = NULL;
m_len = 0;
}
this->m_len = object.m_len;
this->m_base = new T[m_len];
for (int i = 0; i < m_len; i++)
{
m_base[i] = object.m_base[i];
}
return *this;
}
template<typename T>
Vector<T>::~Vector()
{
if (m_base != NULL)
{
delete[] m_base;
m_base = NULL;
m_len = 0;
}
}
总结
模板类对运算符<<进行重载时,一定使用友元函数对运算符<<进行重载,如果使用成员函数进行重载,由于模版类的特殊性,使用成员函数进行重载会报一些很奇怪的错误。
更多推荐
所有评论(0)