01/10/2018, 00:37

Hỏi cách sử dụng class template

template <class T>

    class Array
    {

private:

    T *m_pElement;
    int m_iLength;

public:

    Array(int iLength)
    {
        if (iLength < 0)
        {
            cout << "Loi: chieu dai mang la so am";
            return;
        }

        m_iLength = iLength;
        m_pElement = new T[m_iLength];
    }

    int GetLength()
    {
        return m_iLength;
    }

    void setArray(int elem, T val)
    {
        m_pElement[elem] = val;
    }
    
    T operator[](int elem)
    {
        return m_pElement[elem];
    }
};

Main:

int main()
{
	Array<int> int_array(2);
	int_array.setArray(0, 3);
	int_array.setArray(1, 3.4);
	//int_array.getArray();
	for (int i = 0; i < int_array.GetLength(); i++)
	{
		cout << int_array[i] << endl;
	}
	cout << "-------------------------" << endl;

	Array<float> float_array(3);
	float_array.setArray(0, 3.4);
	float_array.setArray(1, 6.7);
	float_array.setArray(2, 5.6);
	//float_array.getArray();
	for (int i = 0; i < float_array.GetLength(); i++)
	{
		cout << float_array[i] << endl;
	}
	cout << "--------------------------" << endl;

	Array<char> char_array(5);
	char_array.setArray(0, 'H');
	char_array.setArray(1, 'E');
	char_array.setArray(2, 'L');
	char_array.setArray(3, 'L');
	char_array.setArray(4, 'O');
	//char_array.getArray();
	for (int i = 0; i < char_array.GetLength(); i++)
	{
		cout << char_array[i] << endl;
	}
	cout << "--------------------------" << endl;
	return 0; 
}

Mọi người xem giúp em có cách nào mình đổi từ int_array.setArray(0, 3); sang int_array[0] = 3; được không? Cảm ơn mọi người nhiều ạ

Minh Anh viết 02:48 ngày 01/10/2018

bạn có thể viết hàm nạp chồng toán tử = ( overloading operator = ) trong class Array

Thanh Bình Lê viết 02:46 ngày 01/10/2018

mà toán tử = làm sao mình thêm cả chỉ số và giá trị vào luôn bạn, mình thấy là chỉ được bằng cái giá trị thôi mà

Gió viết 02:49 ngày 01/10/2018

Trả về reference của T.

*grab popcorn* viết 02:37 ngày 01/10/2018

Mình thì thêm cái biến index vào + thêm gợi ý của Gió đã làm đc :v

        T& operator[] (int i) {
		if(i >= length) {
			cout << "Out of index with index = " << i;
			cout << endl;
			return elements[i]; //ko nên làm vậy.
		}
		index = i;
		return elements[index];
	}

//

        T& operator=(T other) {
		this.operator[](index) = other;
		return this.operator[](index);
	}
Thanh Bình Lê viết 02:47 ngày 01/10/2018

Cảm ơn mọi người nhiều nha, mình làm bằng cách là thêm dấu & trước operator[]

T& operator[](int elem)
    {
        return m_pElement[elem];
    }
Thanh Bình Lê viết 02:48 ngày 01/10/2018

Mọi người giúp mình với, mình đưa sang file .cpp thì bị lỗi
Array.h

#pragma once
template <class T>
class Array
{
private:
	T *m_pElement;
	int m_iLength;
public:
	Array<T>(int iLength);
	int GetLength();
	T & operator[](int elem);
};

Array.cpp

#include "Array.h"

template<class T>
Array<T>::Array<T>(int iLength)
{
	if (iLength < 0)
	{
		cout << "Loi: chieu dai mang la so am";
		return;
	}
	m_iLength = iLength;
	m_pElement = new T[m_iLength];
}

template <class T>
int Array<T>::GetLength()
{
	return m_iLength;
}

template <class T>
T & Array<T>::operator[](int elem)
{
	return m_pElement[elem];
}

Main:

#include "iostream"
#include "Array.h"
using namespace std;

int main()
{
	Array<int> a(3);
	a[0] = 0;
	a[1] = 1;
	a[2] = 2;

	for (int i = 0; i < a.GetLength(); i++)
		cout << a[i] << endl;
	cout << "------------------------------" << endl;

	Array<int> b(a);
	for (int i = 0; i < b.GetLength(); i++)
		cout << b[i] << endl;
	cout << "-------------------------------" << endl;

	b[1] = 2;
	a = b;

	for (int i = 0; i < b.GetLength(); i++)
		cout << b[i] << endl;
	cout << "-------------------------------" << endl;

	return 0; 
}
Gió viết 02:40 ngày 01/10/2018

Array<T>::Array<T>

Array<T>::Array() thôi bạn

Thanh Bình Lê viết 02:44 ngày 01/10/2018

không được bạn ơi, template mình phải định nghĩa trên cùng 1 template, tách ra thì không compile được, nên mình đưa nó vào file.h luôn

Bài liên quan
0