Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: [ Solved ]Nên sử dụng "Class *a" hay "Class a"

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Mặc định [ Solved ]Nên sử dụng "Class *a" hay "Class a"

    Chúng ta nên sử dụng cách nào trong hai trường hợp sau:
    -Giả sử ta cài đặt một class temp thế này
    C++ Code:
    1. class temp{
    2.       public:
    3.     int a;
    4.     temp(){a=1;}
    5.     temp(int _a){
    6.     a=_a;
    7.     }
    8.     void xuat(){
    9.         cout<<"Gia tri so a la: "<<a;
    10.     }
    11. }

    * Vậy việc sử dụng class đó với 2 cách sau thì nên chọn cách nào:
    - Cách 1:
    C++ Code:
    1. void main(){
    2.     temp *x=new temp(5);
    3.     x->xuat();
    4. }

    -Cách 2:
    C++ Code:
    1. void main(){
    2.     temp x(5);
    3.     x.xuat();
    4. }

    Theo bạn chọn cách nào?
    Không biết ghi gì luôn ...

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Cái này tùy mục đích sử dụng thôi chứ bạn
    PHP Code:
    void main(){
        
    temp *x=new temp(5);
        
    x->xuat();

    cái này là con trỏ đối tượng,dùng cấp phát động ,còn kiểu kia thì tạo đối tượng bình thường.Cái này là vê pointer,khi nào thì nên dùng con trỏ chắc bạn biết mà
    Cánh Chym ứ mỏi

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Cũng giống như anh khai báo

    C Code:
    1. int a[20];
    hoặc
    C Code:
    1. int *a=new int[20];

    Theo anh cái nào hay hơn ? ^_^

  4. #4
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    số 20 quá nhỏ, sizeof temp quá nhỏ
    ==> nên dùng khai báo
    int a[20];
    temp x(5);

    Dùng cấp phát động sẽ làm ct chậm hơn và làm hổng bộ nhớ

    Mà tốt nhất là các bạn nên tránh cấp phát động, chỉ dùng khi thực sự cần thiết, và nên gom tất cả các phát biểu new về một mối

    Ví dụ
    Thay vì mỗi lần cần cấp phát bộ nhớ tui lại gọi new ở nhiều chỗ rải rác thì
    tui viết ra 1 lớp Buffer để qunả lý

    Code:
    template <class T>
    class SafeBuffer
    {
    protected:
    	T* m_pAlloc;
    	unsigned int m_iAllocLen;
    	unsigned int m_iCapacity;
    
    	void CopyBuffer(T* pDes, const T* pSrc, unsigned int iLen, bool bIsAssignedOBO)
    	{
    		if (pDes == pSrc || pSrc == NULL || pDes == NULL || iLen <= 0) return;
    		if (bIsAssignedOBO)
    		{
    			for (unsigned int i = 0; i < iLen; ++i)
    			{
    				pDes[i] = pSrc[i];
    			}
    		}
    		else
    			memcpy(pDes, pSrc, iLen*sizeof T);
    
    	}
    
    
    	const SafeBuffer<T>& Assign (const SafeBuffer<T> &other, bool bIsOBO)
    	{
    		Alloc(other.m_iAllocLen);
    		CopyBuffer(m_pAlloc, other.m_pAlloc, m_iAllocLen, bIsOBO);
    		m_iAllocLen=other.m_iAllocLen;
    		return *this;
    	}
    
    	void InitDefault()
    	{
    		m_pAlloc = NULL;
    		m_iAllocLen = 0;
    		m_iCapacity = 0;
    	}
    
    public:	
    	SafeBuffer()
    	{
    		InitDefault();
    	}
    
    	SafeBuffer(const SafeBuffer<T> &other, bool bIsOBO = false)
    	{
    		m_pAlloc=NULL;
    		Assign(other, bIsOBO);
    	}
    
    	const SafeBuffer<T>& Assign (const SafeBuffer<T> &other)
    	{
    		return Assign(other, false);
    	}
    
    	const SafeBuffer<T>& AssignOBO (const SafeBuffer<T> &other)
    	{
    		return Assign(other, true);	
    	}
    
    	T* GetPointer()
    	{
    		if (IsNull()) return NULL;
    		return m_pAlloc;
    	}
    
    	const T* GetPointer() const
    	{
    		if (IsNull()) return NULL;
    		return m_pAlloc;
    	}
    
    	unsigned int GetCapacity() const
    	{
    		return m_iCapacity;
    	}
    
    	unsigned int GetAllocLen() const
    	{
    		return m_iAllocLen;
    	}
    	
    	bool IsNull() const 
    	{
    		return (m_pAlloc == NULL || m_iAllocLen <= 0);
    	}
    
    	T* Alloc(unsigned int iAllocLen)
    	{
    		if (iAllocLen <= m_iCapacity) 
    		{
    			m_iAllocLen = iAllocLen;
    			return GetPointer();
    		}
    
    		Free();
    		m_pAlloc = new T[iAllocLen];
    		m_iAllocLen = iAllocLen;
    		m_iCapacity = iAllocLen;
    		return GetPointer();
    	}
    	
    	void LazyFree()
    	{
    		m_iAllocLen = 0;
    	}
    
    	void Free()
    	{
    		delete[] m_pAlloc;
    		InitDefault();
    	}
    	
    	const SafeBuffer<T>& operator = (const SafeBuffer<T> &other)
    	{
    		return AssignOBO(other);
    	}
    
    	virtual ~SafeBuffer()
    	{
    		Free();
    	}
    };
    Code rất đơn giản nhưng lại vô cùng tiện ích (code này là code xịn đấy nhá, đã chạy thương mại gần chục năm rrồi)

    Ví dụ
    SafeBuffer<char> buf;
    char *strYourName = buf.Alloc(1024); //hoặc buf.Alloc(1024); strYourName = buf.GetPointer();
    //xử lý strYourName...
    //xong rồi, khỏi cần quan tâm delete
    Đã được chỉnh sửa lần cuối bởi nguyentuan2 : 18-04-2008 lúc 10:04 PM.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Dùng cấp phát động sẽ làm ct chậm hơn và làm hổng bộ nhớ
    Về phần chậm hơn thì chắc phải nhờ Anh NguyenTuan giải thích dùm T_T ? Còn hổng bộ nhớ em đoán là phải handle delete[].
    C++ Code:
    1. int *a=new int[20];
    Flexible solution
    C/C++ hay ỡ chỗ nó cho user tác động trực tiếp đến resource mà họ dụng, C++ không có garbage collection như Java và C# nhưng đã học C++ mà dùng int a[20] thì T_T, còn đi làm thì em chưa đi nên không dám nói T_T. Nhưng nếu bài tập thì em cũng thích dùng int* a not int *a. Cách 1 mang nhiều ý nghĩa hơn : pointer to an int.

  6. #6
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Mặc định [ Solved ]Nên sử dụng "Class *a" hay "Class a"

    Khi xin vùng nhớ thì chắc chắn là phải nhờ đến hệ điều hành rồi, nó sẽ kiểm tra vùng heap nào còn trống, còn trống bao nhiêu, và với window thì còn có bước kiểm tra cấp phát virtual memory khi physical mem đã ở trạng thái low.
    Các bước lằng nhằng đó khiến cho lệnh xin cấp phát chậm hơn khai báo tĩnh

    Còn hổng vùng nhớ ý nói giống như tình trạng fragmentary harddisk, phân mảnh, chỗ dùng chỗ không. Càng new vùng nhớ nhỏ nhiều thì càng phân mảnh

    NGoài ra còn dễ bị leak nếu không cẩn thận

    Không nên, đó là lời khuyên của tui. Chắc chắn là vẫn dùng khi cần, xem qua lớp SafeBUffer, 1 idea nhỏ mà mang nhiều ý nghĩa đó ..

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Một câu hỏi cũng đáng để bàn luận. Hy vọng sẽ có nhiều hơn từ các thành viên. Có như vậy, những gì là kinh nghiệm, chia sẻ từ các anh chị đi trước mới được thể hiện và chia sẻ nhiều hơn.
    Thanks anh nguyentuan2 nhiều. Tuy thời gian của anh bận rộn, nhưng lại có thể chia sẻ là điều may mắn cho thành viên Cộng đồng C Việt.
    Không biết ghi gì luôn ...

  8. #8
    Ngày gia nhập
    01 2008
    Bài viết
    148

    uhm , thank's các anh nhiều , em đã hiểu đc nhiều điều rùi,em đã giải quyết đc5 vấn đề bên trên

Các đề tài tương tự

  1. nghĩa của 3 từ "principals", "artifacts", "securables" là như thế nào?
    Gửi bởi ntbao trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 2
    Bài viết cuối: 02-09-2017, 06:36 PM
  2. Lập trình C Cụm từ "Storage Class Specifier" trong lập trình C/C++ có ý nghĩa là gì
    Gửi bởi binh_ckd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 19-04-2013, 11:37 PM
  3. Lỗi "Invalid token '(' in class, struct, or interface member declaration"
    Gửi bởi Zero79 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 26-04-2012, 03:29 PM
  4. Lỗi "missing storage-class or type specifiers" Help!!!
    Gửi bởi hugo_foreyes trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 02-06-2011, 01:43 AM
  5. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn