在标题中定义并包含在两个源代码中的结构仅定义在一个中

时间:2011-10-12 03:43:08

标签: c++

我在头文件中定义了一个结构,其中包含另外三个#include头文件的文件。一个是另一个头(queue.h)文件,它定义了一个非常基本的哈希表,另外两个是源代码,其中一个是从哈希表头(queue.cpp)定义函数而另一个是main(p2.cpp) 。

我遇到的问题是结构似乎在p2.cpp中正常工作但在queue.h中编译器告诉我结构未定义。

这是包含结构定义的p2.h。

#ifndef __P2_H__
#define __P2_H__

#define xCoor 0
#define yCoor 1

#include <iostream>
#include <string>
#include "queue.h"
#include "dlist.h"  //linked list which I know works and is not the problem


using namespace std;

struct spot {
    float key[2];
    string name, category;
};

#endif /* __P2_H__ */

我在此标题中包含了queue.h,因此我只需要在p2.cpp中包含p2.h。

这是p2.cpp

#include <iostream>
#include <string>
#include <iomanip>
#include "p2.h"
using namespace std;


int main () {

    cout << fixed;
    cout << setprecision (4);
    Queue hashTable;
    spot *spot1 = new spot;
    spot1->key[xCoor] = 42.2893;
    spot1->key[yCoor] = -83.7391;
    spot1->name = "NorthsideGrill";
    spot1->category = "restaurant";
    hashTable.insert(spot1);
    Dlist<spot> test = hashTable.find(42.2893, -83.7391);
    while (!test.isEmpty()) {
        spot *temp = test.removeFront();
        cout << temp->key[xCoor] << " " << temp->key[yCoor] << " " << temp->name << " " << temp->category << endl;
        delete temp;
    }
    return 0;
}

哈希表中的地点和项目并将其取回。

这是queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <iostream>
#include <string>
#include "dlist.h"
#include "p2.h"
using namespace std;

class Queue {
    // OVERVIEW: contains a dynamic array of spaces.

 public:

    // Operational methods

    bool isEmpty();
    // EFFECTS: returns true if list is empy, false otherwise

    void insert(spot *o);
    // MODIFIES this
    // EFFECTS inserts o into the array

    Dlist<spot> find(float X, float Y);

    // Maintenance methods
    Queue();                                   // ctor
    ~Queue();                                  // dtor

 private:
    // A private type
    int numInserted;
    int maxElts;
    Dlist <spot>** queue;

    // Utility methods

    //Increases the size of the queue.
    void makeLarger();

    int hashFunc(float X, float Y, int modNum);

};


#endif /* __QUEUE_H__ */

这是queue.cpp

#include <iostream>
#include <string>
#include <cstdlib>
#include "queue.h"
using namespace std;

bool Queue::isEmpty() {
    return !numInserted;
}

void Queue::insert(spot *o) {
    if (numInserted >= maxElts) {
        makeLarger();
    }
    int index = hashFunc(o->key[xCoor], o->key[yCoor], maxElts);
    queue[index] -> insertFront(o);
}

Queue::Queue() {
    numInserted = 0;
    maxElts = 1000;
    queue = new Dlist<spot>*[maxElts];
    for (int i = 0; i < maxElts; i++) {
        queue[i] = new Dlist<spot>;
    }
}

Queue::~Queue() {
    for (int i = 0; i < maxElts; i++) {
        delete queue[i];
    }
    delete[] queue;
}

void Queue::makeLarger() {
    Dlist <spot>** temp = queue;
    queue = new Dlist <spot>*[maxElts*2];
    for (int i = 0; i < maxElts*2; i++) {
        queue[i] = new Dlist<spot>;
    }
    for (int i = 0; i < maxElts; i++) {
        while (!temp[i] -> isEmpty()) {
            spot *spotTemp = temp[i] -> removeFront();
            int index = hashFunc(spotTemp->key[xCoor], spotTemp->key[yCoor], maxElts*2);
            queue[index] -> insertFront(spotTemp);
        }
    }
    for (int i = 0; i < maxElts; i++) {
        delete temp[i];
    }
    delete[] temp;
    maxElts *= 2;
}

int Queue::hashFunc(float X, float Y, int modNum) {
    return ((int)(10000*X) + (int)(10000*Y))%modNum;
}

Dlist<spot> Queue::find(float X, float Y) {
    Dlist<spot> result;
    Dlist<spot> *temp = new Dlist<spot>;
    int index = hashFunc(X, Y, maxElts);
    while (!queue[index] -> isEmpty()) {
        spot *curSpot = queue[index] -> removeFront();
        if ((curSpot->key[xCoor] == X) && (curSpot->key[yCoor] == Y)) {
            result.insertFront(new spot(*curSpot));
        }
        temp -> insertFront(curSpot);
    }
    delete queue[index];
    queue[index] = temp;
    return result;
}

我相信问题出现在我的queue.h文件中,因为它是我得到所有错误的地方,例如“spot尚未声明”。每次spoth出现在queue.h中我至少有一个错误。我四处寻找这样的东西,但我能找到的只是人们试图在多个源文件中共享一个结构的一个实例,或者是一个明显的问题,即在一个头中放置一个结构并将该头包含在多个源文件中(这就是什么我在做,但我的问题似乎是一个相当独特的问题。)

3 个答案:

答案 0 :(得分:3)

您在实际定义queue.h的标头中包含spot,因此,实际包含的文件spot尚未定义。

对于范围保护,请注意实现保留以双下划线开头的标识符,不要使用它们。

即使在简单的C中,这也是一个糟糕的选择:

#define xCoor 0
#define yCoor 1

改为使用:

enum {
    xCoor = 0
  , yCoor = 1
};

答案 1 :(得分:1)

好的,首先永远不要在头文件中使用“using”子句(它会破坏名称空间的目的)

2nd提供了一个无法编译的完整示例

答案 2 :(得分:0)

除了其他人所说的,你还有一个循环引用错误,这也可能导致类似的未定义符号错误。你有queue.h包含p2.h,其中包括queue.h。