Требуется помощь по включению / внедрению структуры (часть 2) Переполнение стека

Я пытаюсь адаптировать немного кода для двусвязного списка, который будет включен и использован в моем файле mysh.cpp, и я получаю

mysh.cpp:88: error: no matching function for call to ‘readcommand::initialize(linked_list*)’
readcommand.h:32: note: candidates are: static void readcommand::initialize(readcommand::linked_list*)
mysh.cpp:100: error: no matching function for call to ‘readcommand::add(linked_list*, char*&)’
readcommand.h:34: note: candidates are: static void readcommand::add(readcommand::linked_list*, char*)
mysh.cpp:114: error: no matching function for call to ‘readcommand::traverse(linked_list*, void(char*))’
readcommand.h:38: note: candidates are: static void readcommand::traverse(readcommand::linked_list*, void (*)(char*))

и аналогичные ошибки для функций add (connected_list *, char *) и traverse (connected_list *, void (* callback) (char *)) в моем файле readcommand.cpp (заголовок включен в mysh.cpp


У меня была проблема несколько дней назад, включающая более ранний шаг в получении моего заголовочного файла для работы с mysh.cpp (Предыдущий вопрос), и с тех пор решили это, переместив определения структуры в начало файла readcommand.h. Теперь я застрял с этой ошибкой, и не уверен, куда идти дальше.

Вот соответствующие части файлов:

readcommand.cpp

static void initialize (linked_list *list) {
list->first = 0;
list->last = 0;
}

static void add (linked_list *list, char *word) {
node *nodeX;

nodeX = talloc();

if (! nodeX) {
fprintf (stderr, "allocation failure\n");
exit (EXIT_FAILURE);
}

nodeX->word = word;

if (list->last) {
list->last->next = nodeX;
nodeX->prev = list->last;
list->last = nodeX;
}
else {
list->first = nodeX;
list->last = nodeX;
}
}

readcommand.h

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>

struct node {
const char *word;
node *prev;
node *next;
};

struct linked_list {
node *first;
node *last;
};

class readcommand {

public:

// Struct Definitions
typedef node node_t;
typedef linked_list linked_list_t;

// Creation
static void initialize (linked_list *list);
node *talloc ();
static void add (linked_list *list, char *word);

// Modification and Traversal
static void del_list (linked_list *list, node *nodeX);
static void traverse (linked_list *list, void (*callback) (char *));
static void reverse (linked_list *list, void (*callback) (char *));
static void traverse_delete (linked_list *list, int (*callback) (char *));
static void free (linked_list *list);
static int delete_all (char *word);
static void print (char *word);

};

mysh.cpp

#include "readcommand.h"
int main (int argc, char** argv) {

readcommand read;
linked_list list;
string input = "";
read.initialize (& list);

// Read input string here
getline (cin, input);
cout << endl;

// Parse words individually and add to linked list
int len = input.length();
char *str = (char *) input.c_str();
char *word = strtok (str, " ");

while (word != NULL) {
read.add (& list, word);
word = strtok (NULL, " ");
}

read.traverse(& list, read.print);
printf("\n");

return (0);
}

Должен ли я инициализировать «список связанных списков» по-другому, или это просто требует другой реорганизации объявлений?

Заранее спасибо за помощь.


ОБНОВИТЬ: С изменением, упомянутым Стивеном Линем, я получаю следующие ошибки:

mysh.cpp:88: undefined reference to `readcommand::initialize(linked_list*)'
mysh.cpp:100: undefined reference to `readcommand::add(linked_list*, char*)'
mysh.cpp:114: undefined reference to `readcommand::print(char*)'
mysh.cpp:114: undefined reference to `readcommand::traverse(linked_list*, void (*)(char*))'

ОБНОВЛЕНИЕ 2: Моя новая ошибка:

mysh.cpp:114: error: no matching function for call to ‘readcommand::traverse(linked_list*, <unresolved overloaded function type>)’
readcommand.h:35: note: candidates are: void readcommand::traverse(linked_list*, void (*)(char*))

mysh.cpp

read.traverse(& list, read.print);

readcommand.cpp

void readcommand::traverse (linked_list *list, void (*callback) (char *)) {
node *nodeX;

for (nodeX = list->first; nodeX; nodeX = nodeX->next) {
callback ((char *) nodeX->word);
}
}

void readcommand::print (char *word) {
printf ("%s, ", (char *) word);
}

0

Решение

Удалить строки:

// Struct Definitions
struct node;
struct linked_list;

Вы скрываете определения глобальных типов этих структур новыми типами, объявленными локальными для класса readcommand

Также:

typedef struct node node_t;
typedef struct linked_list linked_list_t;

Хорошо как:

typedef node node_t;
typedef linked_list linked_list_t;

И предпочтительнее в C ++, хотя первый тоже будет работать.

РЕДАКТИРОВАТЬ:

Кроме того, ваши функции не определены должным образом, они определены как глобальные функции, а не функции-члены:

static void initialize (linked_list *list) {
// ...
}

должно быть

static void readcommand::initialize (linked_list *list) {
// ...
}

и аналогично для других ваших определений. Обратите внимание, что, поскольку кажется, что все ваши функции static (кроме одной?), и у вас нет переменных-членов, вы на самом деле не используете класс readcommand для всего, кроме пространства имен … т.е. Вы не используете никаких объектно-ориентированных функций. Это приемлемо, но в данном случае это не является вашим намерением, потому что вы создаете экземпляр объекта класса readcommand и вызов статической функции с помощью точки (.) оператор на это, что возможно, но не имеет смысла.

Вы, вероятно, хотите не использовать staticи хочу сделать list переменная-член readcommand, но я не уверен на 100%. В противном случае вы можете просто пропустить создание объекта целиком и вызвать все как readcommand::initialize(...), так далее.

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector