Переопределение другой структуры с тем же именем

Рейтинг: 0Ответов: 2Опубликовано: 25.03.2023

linked_list.h

#ifndef LINKED_LIST_H
#define LINKED_LIST_H
struct Data {
    int data;
    Data(int _data = 0);
    ~Data();
};

struct Node {
    Data data;
    Node* next_node;
    Node* prev;
    Node(Data _data = Data());
    ~Node();
};

class List {
    Node* head;
public:
    List();
    ~List();
    void push_back(Data data);
    void pop_back();
    void show(List* list);
};
#endif // LINKED_LIST_H

queue.h

#ifndef QUEUE_H
#define QUEUE_H
struct Data {
    int data;
    Data(int _data = 0);
    ~Data();
};

struct Node {
    Data data;
    Node* next_node;
    Node(Data _data = Data());
    ~Node();
};

class Queue {
    Node* head;
public:
    Queue();
    ~Queue();
    void push(Data data);
    void pop();
    void show(Queue* head);
};
#endif // QUEUE_H

tests.cpp

#include "tests.h"
#include "linked_list.h"
#include "queue.h"

void test_linkedlist() {
    List list;
    list.push_back(1);
    list.push_back(2);
    list.push_back(3);
    list.show(&list);
}

void test_queue() {
    Queue queue;
    queue.push(1);
    queue.push(2);
}

Реализация, само собой, различается.

Собственно о проблеме. При попытки компиляции выдает ошибку "redefinition of ‘struct Data’", соответственно с Node та же история. Сёрф проблемы ничего не дал, везде преподносят другой корень ошибки. Есть ли какие-то пути избавления? Пожалуйста, если есть возможность, можете описать причину недовольства со стороны компилятора.

Ответы

▲ 1Принят

У вас объявление классов с одним именем но разного предназначения, один для списков, другой для очереди. Конфликт одноимённых классов решается в заключении их в разные пространства имён или в само определение классов.
Например, заключим их во внутрь класса Queue :

queue.h :

#ifndef QUEUE_H
#define QUEUE_H
class Queue {
public :
struct Data {
    int data;
    Data(int _data = 0);
    ~Data();
};

struct Node {
    Data data;
    Node* next_node;
    Node(Data _data = Data());
    ~Node();
};

    Queue();
    ~Queue();
    void push(Data data);
    void pop();
    void show(Queue* head);
private:
    Node* head;
};
#endif // QUEUE_H

и так-же то-же самое в linked_list.h, и проблема решится.
Если нужно удалённо создать например объект Data типа Queue, то пишите тип с добавлением имени класса Queue :: Data.

▲ 1

У вас объявления struct Data и struct Node в двух заголовочных файлах. И вы оба их включаете

#include "linked_list.h"
#include "queue.h"

Вот и получаете проблему.

Вынесите объявления в отдельный заголовочный файл, а уже его затем включайте куда надо.

И, кстати, не самая хорошая идя — включать определения функций типа

void test_queue() {
    Queue queue;
    queue.push(1);
    queue.push(2);
}

в заголовочный файл