2016-10-20 3 views
0

Я хочу написать такой код, но он не работает:вперед декларация члена структуры

struct ast; 
struct parser; 

struct parser 
{ 
    struct node 
    { 
     node *parent; 
    }; 

    ast build_ast() //here we want to use object of ast tyoe 
    { 
     node *ret = new node; 
     return ast(ret); 
    } 
}; 

struct ast 
{ 
    parser::node *root; //here we try to access member struct of y 
    ast(parser::node *rt):root(rt){} 
}; 

Проблема заключается в том, что я пытаюсь создать в парсер объект незавершенного типа. Если я заменяю реализации структур, проблема в том, что я пытаюсь получить доступ к структуре элемента неполного типа. Очевидно, я могу решить эту проблему, сделав узел независимой структурой, но это кажется плохим, потому что я могу захотеть иметь другие типы узлов в своей программе. Вопрос в следующем: могу ли я каким-либо образом сделать декларацию forward структуры узла вне структуры синтаксического анализатора? Например:

struct ast; 
struct parser; 
struct parser::node; //making a forward declaration of member struct 

Если этого не может быть сделано, каковы способы разрешения конфликта?

+0

Вы никогда не вперед объявлен 'node'. –

+0

просто объявите функцию ast build_ast() в структуре и определите ее позже, после struct ast. – arayq2

+0

Поместите объявление и определение классов в их соответствующие заголовки и реализацию функций-членов в файле '.cpp', где вы также должны включить соответствующие заголовки. – Nawaz

ответ

0

Вы должны отложить определение build_ast до ast полного типа:

inline ast build_ast(); //here we want to use object of ast type 

inline здесь, чтобы сделать это заявление функционально идентично тому, что вы имели в примере. Вы можете удалить его и переместить build_ast в файл реализации

Вне определения структуры:

ast parser::build_ast() 
{ 
    node *ret = new node; 
    return ast(ret); 
} 

Направить-объявить node, что вам нужно сделать это в parser определения. Другими словами, вы не можете переслать - объявить внутренний класс, не определяя внешний.

struct parser 
{ 
    struct node; 
    // ... 
}; 

Вы можете приступить к определению:

struct parser::node 
{ 
    node *parent; 
}; 
Смежные вопросы