c++ - 为什么包含.h文件报错,包含.cpp文件却可以?!
伊谢尔伦
伊谢尔伦 2017-04-17 13:15:27
0
2
717

头文件:XXX.h

#ifndef QUEUE_BUFFER_H_
#define QUEUE_BUFFER_H_


template<typename T>
struct Buffer
{
    T _data;
    int _BufNo;
    Buffer *next;
    Buffer(int No, T data): _data(data), _BufNo(No), next(NULL) {}
};

template<typename T>
class Buffer_Queue
{
private:
    int _length; // 队列元素个数
    Buffer<T> *front; // 队列的头指针
    Buffer<T> *rear;  // 队列的尾指针
    bool isEmpty() const; // 判断队列是否为空
public:
    Buffer_Queue(T data, int length = 10); // 构造函数
    ~Buffer_Queue();
    Buffer<T> *getbuf(); // 获得空的buffer(出队)
    void putbuf(Buffer<T> *buf); // 挂载到队尾(入队)
    

    void display(); // 测试输出

};

#endif

定义:XXX.cpp

#include <cstdlib>
#include <iostream>
#include "queue_buffer.h"

using std::cout;
using std::endl;
using std::cerr;


template<typename T>
Buffer_Queue<T>::Buffer_Queue(T data, int length): _length(length) // 构造函数
{
    front = rear = NULL;        
    int i = 0;

    if (i < _length)
    {
        // 分配第一个结点
        Buffer<T> *p = new Buffer<T>(i++, data);
        if (!p) 
        {
            cerr << "Memory alloc failed" << endl;
            exit(1);
        }
        front = rear = p;
        front->next = NULL; // 多余
    }


    while (i < _length)
    {
        Buffer<T> *p = new Buffer<T>(i++, data);
        if (!p)
        {
            cerr << "Memory alloc failed" << endl;
            exit(1);
        }
        rear->next = p;
        rear = p;
    }
        
}

template<typename T>
bool Buffer_Queue<T>::isEmpty() const
{
    return _length == 0;    
}

template<typename T>
Buffer<T> * Buffer_Queue<T>::getbuf() // 出队
{
    if (isEmpty())    // 如果队列为空,则返回NULL
        return NULL;

    Buffer<T> *p = front;
    front = front->next;
    _length--;
    p->next = NULL;
    if (rear == p) // 只有一个结点
        rear = front;

    return p;
}

template<typename T>
void Buffer_Queue<T>::putbuf(Buffer<T> *buf) // 入队
{
    if (isEmpty())    // 如果队列为空
    {
        front = rear = buf;
        front->next = NULL;
        ++_length;
    }

    // 队列不为空
    rear->next = buf;
    rear = buf;
    rear->next = NULL;
    ++_length;
}

template<typename T>
void Buffer_Queue<T>::display()
{
    Buffer<T> *curr = front; 
    while (curr)
    {
        cout << curr->_BufNo << ": " << curr->_data << endl;    
        curr = curr->next;
    }
}

template<typename T>
Buffer_Queue<T>::~Buffer_Queue()
{
    Buffer<T> *curr = NULL;
    while (front)
    {
        curr = front;
        front = front->next;
        delete curr;
    }
}

测试:test.cpp

#include <iostream>
#include "queue_buffer.h"

int main(void)
{
    Buffer_Queue<int> test(-1); // 10个

    test.display();

    Buffer<int> *p = new Buffer<int>(10, -1);
    test.putbuf(p);

    Buffer_Queue<int> temp(-1, 0); // 0个
    temp.putbuf(p);

    test.display();
    temp.display();

    return 0;
}

编译: g++ xxx.cpp test.cpp -o test
test.cpp文件中包含xxx.h就报错,undefined reference to XXXXXXXX(是调用的那些函数)
test.cpp文件中包含xxx.cpp就不会报错,一切正常

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(2)
小葫芦
  1. include並不關心是h還是cpp,還是ini, 他只是打開那個檔案, 展開在當前這個檔案裡面
    你可以用g++ -E 編譯一下, 看到真實編譯的最終檔案

  2. 連結錯誤嗎....因為你的頭檔裡面寫著模板類別, 然而現在所有的C++編譯器, 都不支援模板分離編譯, 也就是說, 函數的實作得寫在頭文件裡面去

Ty80

根據我在學生時期透過同學累積下來的豐富的C++經驗,我認為你的頭文件裡面用了iostream的東西。 XXX.cpp沒掛是因為你替他include了iostream。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板