Я пытаюсь реализовать хэш-таблицу, которая включает в себя связанные списки. Он охватывает 4 файла, связанных с LinkList.h, LinkList.cpp, hashTable.h и hashTable.cpp, как показано в листинге ниже.
linkedList.h:
struct intLink{
int data;
intLink* nextLink;
intLink* prevLink;
}
class linkList{
private:
intLink* first;
unsigned int numLinks;
public:
linkList();
~linkList();
void append(int dd);
void extend(linkList& ll);
int pop();
unsigned int getTotal();
};
hashTable.h:
#define HASH_TABLE_MAX_SIZE 1000
#include <cassert>
#if !defined(LINKEDLIST_H)
#include "linkedList.h"#endif
class hashTable{
protected:
unsigned int TABLE_SIZE;
linkList** tableAdd;
public:
hashTable(int SIZE);
~hashTable();
};
hashTable.cpp:
#include "hashTable.h"#if !defined(LINKEDLIST_H)
#include "linkedList.h"#endif
hashTable::hashTable(int SIZE){
// c-tor
assert(0 < SIZE and SIZE < HASH_TABLE_MAX_SIZE);
TABLE_SIZE = SIZE;
for (int i=0; i<TABLE_SIZE; i++){
tableAdd[i] = new linkList;
}
}
hashTable::~hashTable(){
// d-tor
}
У меня есть проблема с включением «connectedList.h» в hashTable.h и hashTable.cpp без получения ошибки от компилятора о переопределении членов данных. Мне, пожалуйста, нужен способ обойти это, так как и hashTable.cpp, и hashTable.h нуждаются в классе relatedList.
Это странно для вашего ifdef define endif
должно быть так:
inkedList.h:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
struct intLink{
int data;
intLink* nextLink;
intLink* prevLink;
};
class linkList{
private:
intLink* first;
unsigned int numLinks;
public:
linkList(){};
~linkList(){};
void append(int dd);
void extend(linkList& ll);
int pop();
unsigned int getTotal();
};
#endif /*LINKEDLIST_H*/
hashTable.h:
#ifndef HASHTABLE_H
#define HASHTABLE_H
#include <cassert>
#include "linkedList.h"
#define HASH_TABLE_MAX_SIZE 1000
class hashTable{
protected:
unsigned int TABLE_SIZE;
linkList** tableAdd;
public:
hashTable(int SIZE);
~hashTable();
};
#endif /*HASHTABLE_H*/
hashTable.cpp:
#include "hashTable.h"#include "linkedList.h"
hashTable::hashTable(int SIZE){
// c-tor
assert(0 < SIZE and SIZE < HASH_TABLE_MAX_SIZE);
TABLE_SIZE = SIZE;
for (int i=0; i<TABLE_SIZE; i++){
tableAdd[i] = new linkList;
}
}
hashTable::~hashTable(){
// d-tor
}
Вы видите ошибку, потому что вы нарушили Одно Правило Определения. То есть вы включили объявление одного и того же символа более одного раза. Чтобы решить это, ваш linkedList.h
Файл должен следовать шаблону:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
// file content
#endif
(или хотя бы один #define LINKEDLIST_H
заявление в вашем случае).
Кроме того, используя такие структуры, как:
#if !defined(LINKEDLIST_H)
#include "linkedList.h"#endif
является странно (для меня), вам следует скорее используйте защитные макросы в каждом заголовочном файле и не обращайте внимания на любые другие блоки перевода, которые их включают:
#ifndef PROJECT_SCOPE_UNIQUE_NAME
#define PROJECT_SCOPE_UNIQUE_NAME
// include whatever you want
// header content
#endif
где PROJECT_SCOPE_UNIQUE_NAME
это уникальное имя в вашем проекте, предпочтительно имя / путь к файлу, записанный в верхнем регистре.