Cài đặt iterator cho lớp MyString

template <typename T>
class MyString
{
private:
	char *m_string;
	int m_size;
	int m_reserved_size;
public:
	typedef MyString * iterator;
       iterator begin()
	{
		return iterator(&m_string);
	}
       iterator end()
	{
		return iterator(&m_string[m_size-1]);
	}

Em cài đặt lớp MyString với các hàm và toán tử của class String http://www.cplusplus.com/reference/string/string/

Em có 2 câu hỏi mong mọi người giải đáp với ạ ?

  1. Em cài đặt các toán tử iterator sao ko cài đặt ngoài file này có nghĩa bình thường em khai báo ở file MyString.h và cài đặt MyString.cpp nhưng đối với iterator thì ko dc ?
  2. Em cài đặt các iterator begin() và end() như trên nhưng khi test như dưới đây thì ko ra kết quả cần
    MyString str;
	str = "Day nhau hoc";
	MyString::iterator rit;
	
	rit = str.begin();
	for (rit = str.begin(); rit != str.end(); rit++)printf("%c", *rit);

ko được nghĩa là sao, em bưng

MyString::iterator MyString::begin()
{
    return m_string;
}

vô file MyString.cpp là được mà? À mà m_string đã là con trỏ tới char rồi em ko cần gọi &m_string nó sẽ thành con trỏ tới con trỏ tới char (char**) ko đúng. Với lại template typename T rồi sao m_string của em vẫn là con trỏ tới char, phải là con trỏ tới T (T*) mới đúng chứ :V

iterator end() là cách phần tử cuối cùng 1 đơn vị, nghĩa là m_string + m_size hay &m_string[m_size] mới đúng, ko có -1 ở đây. Em xem minh họa ở đây: https://en.cppreference.com/w/cpp/string/basic_string/end

iterator end

1 Like

xảy ra lỗi anh ơi.

à em làm được rồi cái đầu em phải đổi lại là

typename char*iterator;

Nó là con trỏ kiểu char* chứ ko phải là kiểu MyString
Cảm ơn anh

sửa lại là T* hết mới đúng template

à mà template ko có file .cpp nên em ko mang qua file cpp phải để code hết trong file .h là đúng rồi :V Khi khai báo thì khai báo MyString<char> s; có thêm ngoặc nhọn char vào

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?