Передача списка в класс - PullRequest
0 голосов
/ 14 января 2012

У меня есть список контрольных точек, а затем запустить функцию. Я изначально построил этот список в этой функции, но теперь я должен построить его снаружи. Проблема в том, что я не могу включить checkpoint.h в класс, который реализует эту функцию, потому что checkpoint.h возвращает структуру типа этого класса. Первоначальный список был объявлен в class.c глобально. Как я могу перенести созданный снаружи список в класс, чтобы я мог его использовать?

Итак, у меня есть этот заголовок, turing_machine.h:

#ifndef __TURING_MACHINE__ 
#define __TURING_MACHINE__

#include "tape.h"
#include "alphabet.h"
#include "symbol_table.h"

...

#endif

и заголовок checkpoint.h, определяющий класс checkpoint_list:

#ifndef __CHECKPOINT_H__
#define __CHECKPOINT_H__

#include "turing_machine.h"

...

#endif

Итак, я хочу отправить в функцию из turing_machine.h список структур checkpoint, но я не могу ничего изменить, потому что так должны оставаться классы.

У меня также turing_machine.c:

#include "turing_machine.h"
#include "checkpoint.h"
#include "symbol_table.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

checkpoint_list *c;

Итак, в начале я создал в turing_machine этот список, c, но теперь я должен создать его снаружи, и мне нужно инициализировать этот список c, но я не знаю как. Я надеюсь, что это более понятно.

Я неправильно использовал термин класс; У меня есть только файлы .c и .h.

1 Ответ

0 голосов
/ 14 января 2012

Чтение между строк, в некоторой степени, я думаю, что ваша проблема в том, что у вас есть «взаимно ссылающиеся» структуры.

Способ обойти это с помощью неполного определения типа:

typedef struct checkpoint_list checkpoint_list;

Затем вы можете использовать это внутри turing_machine.h:

#ifndef TURING_MACHINE_H_INCLUDED
#define TURING_MACHINE_H_INCLUDED

#include "tape.h"
#include "alphabet.h"
#include "symbol_table.h"

typedef struct checkpoint_list checkpoint_list;

typedef struct turing_machine
{
    ...
} turing_machine;

extern checkpoint_list *tm_function(turing_machine *);
extern turing_machine  *tm_create(const char *); 

#endif

И внутри checkpoint.h вы можете написать:

#ifndef CHECKPOINT_H_INCLUDED
#define CHECKPOINT_H_INCLUDED

#include "turing_machine.h"

/* No typedef here in checkpoint.h */
struct checkpoint_list
{
    ...
};

extern checkpoint_list *cp_function(const char *);
extern turing_machine  *cp_machine(checkpoint_list *);

#endif

Эта техника распознается и определяется Cстандартный (C90, не говоря уже о C99 или C11).

Обратите внимание, что я также переименовал включенные охранники;имена, начинающиеся с двойного подчеркивания, зарезервированы для «реализации» (имеется в виду компилятор C и его библиотеки), и вы не должны изобретать и использовать такие имена в своем собственном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...