Объявление метода C ++ несовместимо с - PullRequest
0 голосов
/ 21 сентября 2019

Вот простой класс C ++ для двоичного дерева.Компилятор выдает ошибку:

Объявление E0147 несовместимо с "void BinaryTree :: getLeftChild (node ​​* n)"

Здесь node является структурой, определенной вprivate секция в классе.Я не уверен, почему в нем говорится о несовместимой декларации.

//------------------------ BinaryTree class-----------------
class BinaryTree
{
public:
    BinaryTree();
    ~BinaryTree();
    void createRootNode();
    void getChildren();
    void getLeftChild(node* n);
    void getRightChild(node* n);

private:
    typedef struct node
    {
        node *lchild = nullptr;
        int data;
        node *rchild = nullptr;
    }node;

    queue <node*> Q;
    node *root; 
};

BinaryTree::BinaryTree()
{
    createRootNode();
    getChildren();
}

void BinaryTree::createRootNode()
{
    root = new node();
    cout << "Enter value for root node" << endl;
    cin >> root->data;
    Q.push(root);
}

void BinaryTree::getChildren()
{
    while (Q.empty == false)
    {
        getLeftChild(Q.front());
        getRightChild(Q.front());
        Q.pop();
    }
}

void BinaryTree::getLeftChild(node* n)
{

}

void BinaryTree::getRightChild(node* n)
{

}

Код изображения с ошибками

image

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Я получил еще одну структуру в глобальной области видимости, объявленную как "узел", которая создала хаос.Во-вторых, мне также нужно исправить порядок открытых и закрытых разделов.

Вот рабочий код

    //------------------------ BinaryTree class-----------------
class BinaryTree
{
private:
    typedef struct node
    {
        node *lchild = nullptr;
        int data;
        node *rchild = nullptr;
    }node;

    queue <node*> Q;
    node *root;

public:
    BinaryTree();
    ~BinaryTree();
    void createRootNode();
    void getChildren();
    void getLeftChild(node* n);
    void getRightChild(node* n);
};

BinaryTree::BinaryTree()
{
    createRootNode();
    getChildren();
}

void BinaryTree::createRootNode()
{
    root = new node();
    cout << "Enter value for root node" << endl;
    cin >> root->data;
    Q.push(root);
}

void BinaryTree::getChildren()
{
    while (Q.empty() == false)
    {
        getLeftChild(Q.front());
        getRightChild(Q.front());
        Q.pop();
    }
}

void BinaryTree::getLeftChild(node* n)
{

}

void BinaryTree::getRightChild(node* n)
{

}
0 голосов
/ 21 сентября 2019

Первая ошибка заключается в том, что вам необходимо переслать объявление узла.Вторая ошибка заключается в том, что вы пытаетесь получить доступ к узлу, который объявлен в частном порядке внутри BinaryTree.

Первый ответ:

typedef struct node
{
  node* lchild = nullptr;
  int data;
  node* rchild = nullptr;
}node;

class BinaryTree
{
public:
  BinaryTree();
  ~BinaryTree();
  void createRootNode();
  void getChildren();
  void getLeftChild(node* n);
  void getRightChild(node* n);

private:
  node* root;
};

void BinaryTree::getLeftChild(node* n)
{

}
void BinaryTree::getRightChild(node* n)
{

}

Теперь код прекрасно компилируется.

Или, если вы хотите, чтобы typedef был определен как private внутри, вам нужно, чтобы реализация находилась внутрикласс также.

Второй ответ:

typedef struct node;

class BinaryTree
{
public:
  BinaryTree();
  ~BinaryTree();
  void createRootNode();
  void getChildren();
  void getLeftChild(node* n)
  {

  }
  void getRightChild(node* n)
  {

  }

private:
  typedef struct node
  {
    node* lchild = nullptr;
    int data;
    node* rchild = nullptr;
  }node;

  node* root;
};
...