自定义模板练习

内容

设计一个容器,可以用来存储不同的类型数据

首先创建一个类:Vector类

[代码] Vector.h

#pragma once
#include <iostream>

template <typename T>
class Vector
{
public:
	Vector(int size=10);
	Vector(const Vector &vector);
	~Vector();
	int getSize();

	T &operator [](int index);
	Vector operator =(const Vector &vector);

	template <typename T>
	friend std::ostream &operator<< (std::ostream &os, const Vector<T> &vector);


private:
	T *m_base;
	int m_len;
};


[代码] Vector.cpp

#include "Vector.h"

template<typename T>
Vector<T>::Vector(int size)
{
	if (size > 0) {
		m_len = size;
		m_base = new T[size];		//m_base = new Student[2]
	}
}

template<typename T>
Vector<T>::Vector(const Vector & vector)
{
	m_len = vector.m_len;
	m_base = new T[m_len];

	for (int i = 0; i < m_len; i++) {
		m_base[i] = vector.m_base[i];
	}
}

template<typename T>
Vector<T>::~Vector()
{
	delete[] m_base;
	std::cout << "调用模板析构函数" << std::endl;
}

template<typename T>
int Vector<T>::getSize()
{
	return m_len;
}

template <typename T>
T &Vector<T>::operator[](int index)
{
	return m_base[index];
}

template <typename T>
Vector<T> Vector<T>::operator=(const Vector & vector)
{
	if (vector.m_len > 0) {
		delete m_base;
		m_len = 0;
	}
	m_len = vector.m_len;
	m_base = new T[m_len];

	for (int i = 0; i < m_len; i++) {
		m_base[i] = vector.m_base[i];
	}

	return *this;
}


template <typename T>
std::ostream & operator<<(std::ostream & os, const Vector<T> & vector)
{
	for (int i = 0; i < vector.m_len; i++) {
		os << vector.m_base[i] << " ";
	}
	os << std::endl;

	return os;
}

[代码] main.cpp

#include "Vector.cpp"

class Student {
public:
	Student() {
		age = 0;
		name = NULL;
	}
	Student(const char *name, int age) {
		int len = strlen(name) + 1;
		this->name = new char[len];
		strcpy_s(this->name, len, name);
		this->age = age;
	}

	Student(const Student &stu) {
		int len = strlen(stu.name) + 1;
		this->name = new char[len];
		strcpy_s(this->name, len, stu.name);
		this->age = stu.age;
	}

	~Student() {
		std::cout << "调用Student析构函数" << std::endl;
		delete[] name;
//		name = NULL;
	}
	friend std::ostream & operator<<(std::ostream & os, const Student & stu);

	Student operator =(const Student &stu) {
		
		name = new char[strlen(stu.name)+1];
		strcpy_s(name, strlen(stu.name)+1, stu.name);
		age = stu.age;

		return stu;
	}

private:
	char *name;
	int age;
};

std::ostream & operator<<(std::ostream & os, const Student & stu) {
	os << "姓名:" << stu.name 
		<< " 年龄:" << stu.age;

	return os;
}

int main() {
	/*Vector<int> v1(10);

	for (int i = 0; i < v1.getSize(); i++) {
		v1[i] = i;
	}

	std::cout << "-------V1--------\n" << v1 << std::endl;

	Vector<int> v2(v1);
	std::cout << "-------V2--------\n" << v2 << std::endl;

	Vector<int> v3(20);
	v3 = v1;

	std::cout << "-------V3--------\n" << v3 << std::endl;*/

	Student stu1("小花", 18);
	Student stu2("小美", 20);

	Vector<Student> student(2);
	student[0] = stu1;
	student[1] = stu2;

	/*for (int i = 0; i < student.getSize(); i++) {
		std::cout << student[i] << std::endl;
	}*/

	std::cout << "-------student --------\n" << student << std::endl;
	
	return 0;
}

总结

在main.cpp中创建了一个学生类,重写了赋值运算符,没有重写拷贝构造函数。
因为赋值构造函数是返回的Student类型,return过程中是会调用拷贝构造函数
解决方法:
1、重写拷贝构造函数
2、重写的赋值运算符返回引用类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值