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

Đề tài: Stack Dùng Danh sách Liên Kết có template.Giúp mình sửa lỗi

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    2

    Mặc định Stack Dùng Danh sách Liên Kết có template.Giúp mình sửa lỗi

    file List.h
    Code:
    #if !defined(AFX_LIST_H__B4D3D45C_8E03_4D09_83BB_A733F44C7E6E__INCLUDED_)
    #define AFX_LIST_H__B4D3D45C_8E03_4D09_83BB_A733F44C7E6E__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    template <class T> class Stack;
    
    template <class T>
    class Node  
    {
    	T data;
    	Node<T> *next;
    public:
    	Node();
    	Node(const T& d , Node* p = NULL);
    	bool InsertAfter(const T& d);
    	friend class Stack<T>;
    };
    #endif
    file List.cpp
    Code:
    #include "List.h"
    #include <iostream.h>
    
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    
    template <class T>
    Node<T>::Node()
    {
    	next = NULL;
    }
    
    template <class T>
    Node<T>::Node(const T& d , Node* p)
    {
    	data = d;
    	next = p;
    }
    
    template <class T>
    bool Node<T>::InsertAfter(const T &d)
    {
    	Node *pNew = new Node(d,next);
    	if(pNew == NULL)
    		return 0;
    	next = pNew;
    	return 1;
    
    }
    file Stack.h
    Code:
    #if !defined(AFX_STACK_H__9597682F_B89F_4370_B100_2C85E5AB5E77__INCLUDED_)
    #define AFX_STACK_H__9597682F_B89F_4370_B100_2C85E5AB5E77__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    template <class T> class stack;
    
    #include "List.h"
    
    template <class T>
    class Stack  
    {
    	Node<T> *pTop;
    	void copy(const Stack&s);
    public:
    	Stack();
    	Stack(const Stack& s);
    	~Stack();
    	Stack& operator=(const Stack& s);
    	void MakeEmpty();	
    	bool IsEmpty();
    	bool Push(const T& x);
    	bool Pop(T& x);
    };
    #endif
    file Stack.cpp
    Code:
    #include <iostream.h>
    #include "Stack.h"
    #include "List.h"
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    template <class T>
    Stack<T>::Stack()
    {
    	pTop = NULL;
    }
    
    
    template <class T>
    Stack<T>::Stack(const Stack& s)
    {
    	pTop = NULL;
    	copy(s);
    }
    
    template <class T>
    Stack<T>::~Stack()
    {
    	MakeEmpty();
    }
    
    template <class T>
    Stack<T>& Stack<T>::operator =(const Stack& s)
    {
    	if(this != &s)
    		copy(s);
    	return (*this);
    }
    
    template <class T>
    void Stack<T>::MakeEmpty()
    {
    	Node<T> *p;
    	while(pTop != NULL)
    	{
    		p = pTop;
    		pTop = pTop->next;
    		delete p;
    	}
    }
    
    template <class T>
    void Stack<T>::copy(const Stack& s)
    {
    	MakeEmpty();
    	Node<T>* p = new Node<T>;
    	this->pTop = p;
    
    	Node<T>*q = s.pTop;
    	while(q != NULL)
    	{
    		p->InsertAfter(q->data);
    		q = s.pTop->next;
    	}
    }
    
    template <class T>
    bool Stack<T>::IsEmpty()
    {
    	return pTop == NULL;
    }
    
    
    template <class T>
    bool Stack<T>::Push(const T& x)
    {
    	Node<T> *pNew = new Node<T>(x,pTop);
    	if(pNew == NULL)
    		return 0;
    	pTop = pNew;
    	return 1;
    }
    
    template <class T>
    bool Stack<T>::Pop(T& x)
    {
    	if(IsEmpty())
    		return 0;
    	else
    	{
    		Node<T> *p = pTop;
    		x = p->data;
    		pTop = pTop->next;
    		delete p;
    		return 1;
    	}
    }
    file Demo.cpp
    Code:
    #include <iostream.h>
    #include "Stack.h"
    void main()
    {
    	Stack<int> s;
    	s.Push(12);
    	int x;
    	s.Pop(x);
    	cout << x;
    }
    Khi mình compile không có lỗi nhưng khi Run hay Rebuild All thì compiler báo 5 errors
    +error LNK2001: unresolved external symbol "public: __thiscall Stack<int>::~Stack<int>(void)" (??1?$Stack@H@@QAE@XZ)
    +error LNK2001: unresolved external symbol "public: bool __thiscall Stack<int>::Pop(int &)" (?Pop@?$Stack@H@@QAE_NAAH@Z)
    + error LNK2001: unresolved external symbol "public: bool __thiscall Stack<int>::Push(int const &)" (?Push@?$Stack@H@@QAE_NABH@Z)
    +error LNK2001: unresolved external symbol "public: __thiscall Stack<int>::Stack<int>(void)" (??0?$Stack@H@@QAE@XZ)
    +Debug/Test.exe : fatal error LNK1120: 4 unresolved externals

    Mình nhớ là khi dùng Template thì bên file .h phải include file .cpp vào nhưng mình làm vậy vẫn báo lỗi.Mong các bạn giúp mình với

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    336

    bạn bỏ cpp vào chung với h ...
    code ra gió bão

  3. #3
    Ngày gia nhập
    03 2009
    Bài viết
    2

    nhưng theo như mình biết thì đúng chuẩn lập trình hướng đối tượng cpp và h phải nằm riêng ra.Nếu mình làm riêng thì sửa lổi sao bạn?

  4. #4
    Ngày gia nhập
    04 2008
    Bài viết
    336

    muốn viết riêng thì phải xài từ khóa export nhưng cái này VC++ chưa hỗ trợ.
    C++ Code:
    1. //Trong file MyTemplateFunction.h
    2. template<class T>
    3. void myTemplateFunction(const T &t1);
    4.  
    5. // Trong file MyTemplateFunction.cpp
    6. export template <class T>
    7. void myTemplateFunction(const T &t1)
    8. {
    9.    ...
    10. }
    Compiler hiện giờ hỗ trợ đó là: Comeau C++ ... (nghe lạ quá nhỉ )
    code ra gió bão

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

    Compiler hiện giờ hỗ trợ đó là: Comeau C++ ... (nghe lạ quá nhỉ )
    gcc cũng có mà nhỉ ? ! Nhưng nói chung bạn nên để chung .h và .cpp cho template, vì nó more formal và appropriate, cái này mình đọc sách thấy nó nói như thế. Còn nếu bạn vẫn muốn để riêng thì dùng gcc thử xem.

  6. #6
    Ngày gia nhập
    01 2009
    Bài viết
    165

    Mặc định Stack Dùng Danh sách Liên Kết có template.Giúp mình sửa lỗi

    cái này mình làm rồi,đừng tách riêng ra làm gì làm chung cho nó đơn giản.

  7. #7
    Ngày gia nhập
    04 2008
    Bài viết
    1

    Mặc định Lỗi "errors LNK2001: unresolver external symbol"

    Lỗi "errors LNK2001: unresolver external symbol "public: __thiscall Stack<int>::~Stack<int>(void)" (??1?$Stack@H@@QAE@XZ)": gây ra do trình biên dịch không tìm thấy khai báo nào cho hàm Stack<int>::~Stack<int>
    mà chỉ có khai báo Stack<T>::~Stack<T>. Trong lúc biên dịch sẻ gây ra lỗi.
    Cách khắc phục: Để đảm bảo tính hướng đối tượng cho chương trình, với các thành phần lớp được thiết kế độc lập thì ta không nên gộp chung 2 phần của file .cpp vào chung với .h. Mà ta nên định nghĩa file .cpp (#define...) rồi sau đó include vào file .h (#inclue "..cpp") ngay trên trước phần #endif, làm tương tự cho 2 file List.h và List.cpp. Bài làm được sửa lại như sau (Chú ý phầ in đậm):
    file List.h
    Code:
    ////////////////////////////Them phan nay/////////////////////////
    #ifndef _LIST_H
    #define _LIST_H
    //////////////////////////////////////////////////////////////////////
    template <class T> class Stack;
    template <class T>
    class Node  
    {
    	T data;
    	Node<T> *next;
    public:
    	Node();
    	Node(const T& d , Node* p = NULL);
    	bool InsertAfter(const T& d);
    	friend class Stack<T>;
    };
    ////////////////////////////Them phan nay/////////////////////////
    #include "List.cpp"
    #endif
    //////////////////////////////////////////////////////////////////////
    file List.cpp
    Code:
    #include "List.h"
    #include <iostream.h>
    
    ////////////////////////////Them phan nay/////////////////////////
    #ifndef _LIST_CPP
    #define _LIST_CPP
    //////////////////////////////////////////////////////////////////////
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    
    template <class T>
    Node<T>::Node()
    {
    	next = NULL;
    }
    
    template <class T>
    Node<T>::Node(const T& d , Node* p)
    {
    	data = d;
    	next = p;
    }
    
    template <class T>
    bool Node<T>::InsertAfter(const T &d)
    {
    	Node *pNew = new Node(d,next);
    	if(pNew == NULL)
    		return 0;
    	next = pNew;
    	return 1;
    
    }
    ////////////////////////////Them phan nay/////////////////////////
    #endif
    //////////////////////////////////////////////////////////////////////
    file Stack.h
    Code:
    ////////////////////////////Them phan nay/////////////////////////
    #ifndef _STACK_H
    #define _STACK_H
    //////////////////////////////////////////////////////////////////////
    
    template <class T> class stack;
    
    #include "List.h"
    
    template <class T>
    class Stack  
    {
    	Node<T> *pTop;
    	void copy(const Stack&s);
    public:
    	Stack();
    	Stack(const Stack& s);
    	~Stack();
    	Stack& operator=(const Stack& s);
    	void MakeEmpty();	
    	bool IsEmpty();
    	bool Push(const T& x);
    	bool Pop(T& x);
    };
    ////////////////////////////Them phan nay/////////////////////////
    #include "Stack.cpp"
    #endif
    //////////////////////////////////////////////////////////////////////
    file Stack.cpp
    Code:
    #include <iostream.h>
    #include "Stack.h"
    #include "List.h"
    ////////////////////////////Them phan nay/////////////////////////
    #ifndef _STACK_CPP
    #define _STACK_CPP
    //////////////////////////////////////////////////////////////////////
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    template <class T>
    Stack<T>::Stack()
    {
    	pTop = NULL;
    }
    
    
    template <class T>
    Stack<T>::Stack(const Stack& s)
    {
    	pTop = NULL;
    	copy(s);
    }
    
    template <class T>
    Stack<T>::~Stack()
    {
    	MakeEmpty();
    }
    
    template <class T>
    Stack<T>& Stack<T>::operator =(const Stack& s)
    {
    	if(this != &s)
    		copy(s);
    	return (*this);
    }
    
    template <class T>
    void Stack<T>::MakeEmpty()
    {
    	Node<T> *p;
    	while(pTop != NULL)
    	{
    		p = pTop;
    		pTop = pTop->next;
    		delete p;
    	}
    }
    
    template <class T>
    void Stack<T>::copy(const Stack& s)
    {
    	MakeEmpty();
    	Node<T>* p = new Node<T>;
    	this->pTop = p;
    
    	Node<T>*q = s.pTop;
    	while(q != NULL)
    	{
    		p->InsertAfter(q->data);
    		q = s.pTop->next;
    	}
    }
    
    template <class T>
    bool Stack<T>::IsEmpty()
    {
    	return pTop == NULL;
    }
    
    
    template <class T>
    bool Stack<T>::Push(const T& x)
    {
    	Node<T> *pNew = new Node<T>(x,pTop);
    	if(pNew == NULL)
    		return 0;
    	pTop = pNew;
    	return 1;
    }
    
    template <class T>
    bool Stack<T>::Pop(T& x)
    {
    	if(IsEmpty())
    		return 0;
    	else
    	{
    		Node<T> *p = pTop;
    		x = p->data;
    		pTop = pTop->next;
    		delete p;
    		return 1;
    	}
    }
    ////////////////////////////Them phan nay/////////////////////////
    #endif
    //////////////////////////////////////////////////////////////////////
    file Demo.cpp
    Code:
    #include <iostream.h>
    #include "Stack.h"
    void main()
    {
    	Stack<int> s;
    	s.Push(12);
    	int x;
    	s.Pop(x);
    	cout << x;
    }
    Các bạn có thể tham khảo bài Demo ở file đã đính kèm. Hoặc tải Tại Đây
    Xin cảm ơn!
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi tienthanhdaklak : 03-06-2010 lúc 09:25 AM. Lý do: chỉnh lại font

  8. #8
    Ngày gia nhập
    12 2009
    Bài viết
    28

    Mình vẫn ko sửa đc nơi. Có cách khác không vậy?
    Mình cũng thường tách ra 2 file .h và .cpp. Bình thường vẫn đc. Sao cái này lại ko đc vậy nhỉ?

  9. #9
    Ngày gia nhập
    05 2011
    Bài viết
    4

    Mình nghĩ là bạn cần phải viết gộp 2 file .cpp và .h lại với nhau, vì trong trường hợp của bạn là áp dụng cho 1 đối tượng tổng quát nên sẽ xảy ra trường hợp lỗi linker. Còn nếu viết tách ra như bạn thì áp dụng cho kiểu dữ liệu cố định!

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

  1. "HELP'' Xây Dựng Lớp Template Danh Sách Liên Kết Đôi
    Gửi bởi dodinhlong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 21-05-2013, 05:19 PM
  2. Kỹ thuật C++ Danh sách liên kết theo hướng đối tượng lỗi với template :(
    Gửi bởi kem92 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 10-11-2011, 09:00 PM
  3. Quản lí sinh viên bằng stack dùng danh sách liên kết. Làm sao để nhập nhiều sinh viên?
    Gửi bởi hoainamken trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 24-08-2011, 10:34 AM
  4. Thắc mắc Template (khuôn hình) trong danh sách liên kết đôi ?
    Gửi bởi oxfordthuongyeu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 25-06-2011, 03:42 PM
  5. kế thừa và template áp dụng cho stack. Giúp sửa lỗi?
    Gửi bởi bach_sau2009 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 02-11-2010, 10:59 AM

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