2012-04-23 4 views
0

Я построил двоичное дерево с помощью корневого указателя.Создание указателя global C++

Разве коренной указатель не должен быть изменен во всех функциях, так как я объявил его глобальным? Как мне это достичь?

Благодаря

// псевдокод (левый, правый указатели объявлены в другом месте)

Node * root = new Node; 


Node * BST::BuildTree(int label) 
{ 
     root->left = changed; 
     root->right = changed; 
} 

Node * BST::GetNode(int label) 
{ 


    BTNode *ptr = root; 

    cout << root->right; //This gives me a seg fault since root is still NULL and not changed 
} 
+0

Я не вижу, где вы назначаете «root» в любом месте. Фактически, насколько я могу судить, «BuildTree» тоже должен ломаться, потому что именно по этой причине - «root» никогда не указывает на «узел». – cHao

+0

Я думаю, что я исправил его –

+0

Вам почти _never_ нужно использовать глобальные переменные, особенно в C++, где у вас есть ссылочные переменные для функций, чтобы вы могли изменять корень по своему усмотрению. – paxdiablo

ответ

3

Это потому, что вы не назначить правильный адрес для root, в вашем коде.

Он должен указывать на действительный узел:

void BST::CreateRoot() 
{ 
    root = new (std::nothrow) Node; 
} 

И в C++, вы должны использовать unnamed namespace когда вы хотите использовать «глобальную переменную». Преимущество в том, что это предотвратит конфликты имен, которые могут быть легко введены глобальными переменными.

namespace 
{ 
    Node * root = NULL; 
} 

Если вы кодируете на C, я бы закончил здесь. Но поскольку вы используете C++, есть еще одна вещь.

Вы должны попробовать все возможное, чтобы avoid using global variables, особенно если у вас их много, которые зависят друг от друга. Обычно вы можете создать одноэлементный класс.

Но я не думаю, что ваше дело в том, что сложно использовать синглтон. Просто добавьте дополнительный входной параметр в свои функции, чтобы указать, на каком узле вы хотите работать.

// @param1(node) can be root or whatever node you want 
Node * BST::BuildTree(Node *node, int label) 
{ 
    node->left = changed; 
    node->right = changed; 
} 
Смежные вопросы