C ++ многофайловая обработка, переопределение членов данных

Я пытаюсь реализовать хэш-таблицу, которая включает в себя связанные списки. Он охватывает 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.

0

Решение

Это странно для вашего 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
}
0

Другие решения

Вы видите ошибку, потому что вы нарушили Одно Правило Определения. То есть вы включили объявление одного и того же символа более одного раза. Чтобы решить это, ваш 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 это уникальное имя в вашем проекте, предпочтительно имя / путь к файлу, записанный в верхнем регистре.

1

По вопросам рекламы [email protected]