2016-05-02 4 views
0

Я хотел бы создать структуру данных Octree в C++. У меня есть заголовочный файл, который выглядит следующим образом:Функция return struct pointer

class Octree 
{ 
public: 
    typedef struct node 
    { 
     int value; 
     node *child[8]; 
    }node; 

    Octree(); 
    ~Octree(); 

    int convert(int sorszam); 
    void clear(struct node*); 
    node* search(int dec,int oct); 
}; 

И я хотел бы написать функцию поиска в файле .cpp, но я всегда получал сообщение об ошибке. Вот код .cpp:

node* Octree::search(int dec, int oct) { 
//doing something here 
return nullptr; 
} 

И сообщение об ошибке говорит:

декларация несовместима с "Octree :: узлом * Octree :: Поиска (интермедиат Декабре, внутр Октябрь)" (объявленной в строке 19 "C: \ Users \ ххх \ Documents \ Visual Studio 2015 \ Projects \ ххх \ ххх \ Octree.h")

Я понятия не имею, Что происходит, потому что тип двух функций является одна и та же. Что я делаю не так?

+5

Попробуйте изменить тип возвращаемого значения в CPP для 'Octree :: узла *' вместо просто 'node *'. Вы также можете отказаться от typedef, не нужно, чтобы в C++. – Chad

+1

или переместите typedef из узла struct вне класса –

+0

Они также могут избавиться от 'typedef', как на C++, вам не нужно украшать имя' struct' 'struct' при его использовании. – NathanOliver

ответ

2

typedef для узла области видимости класса. При использовании

node* Octree::search(int dec, int oct) 

вне тела класса компилятор не знает, что узел, как мы за рамки класса. Вы должны квалифицироваться node с именем класса, как

Octree::node* Octree::search(int dec, int oct) 

Это позволяет компилятору использовать node из класса.


В Octree нет никаких оснований использовать typedef на node. В отличие от C, вам не нужно использовать ключевое слово struct при использовании struct. Вы могли бы

class Octree 
{ 
public: 
    struct node 
    { 
     int value; 
     node *child[8]; 
    }; 
    //... 
}; 

, а затем вы можете просто использовать node, как вы бы с typedef.

+0

Большое спасибо. Теперь совершенно ясно! –

2

Я понятия не имею, что происходит, потому что тип двух функций одинаковый.

Типы не одинаковые. Внутри определения Octree вы определили вложенный класс node. Поэтому в определении Octree имя типа node относится к Octree::node. Вне определения Octree (где вы определили функцию-член), однако node не относится к Octree::node. Он относится к ::node, который, возможно, был объявлен в другом месте.

Что я делаю неправильно?

Вы (случайно) повторно объявляете функцию-член с другим типом возврата, чем то, что было объявлено для возврата. Просто используйте полное имя для обозначения правильного типа:

Octree::node* Octree::search(int dec, int oct) 
+0

Спасибо! Теперь ясно –

2

Ошибка в том, что вы на самом деле не объявили тип node. Вы объявили тип под названием Octree::node. Поскольку определение функции Octree::search находится вне объявления класса, вы должны использовать полное имя типа:

Octree::node* Octree::search(int dec, int oct) { 
...