о указателе C ++ - PullRequest
       35

о указателе C ++

0 голосов
/ 18 сентября 2009

Я только начал практиковать с ++, и я застрял в одной точке. У меня есть класс Node, и у класса есть конструктор, подобный этому:

class Node
{
    public:
          Node(std::string,Node *,int,int,int,int);
    private:
          std::string state;
          Node* parent_node;
          int total_cost;
          int path_cost;
          int heuristic_cost;
          int depth;  
}

Node::Node(std::string state,Node *parent_node,int path_cost,int heuristic_cost,int total_cost,int depth)
{
    this->state=state;
    this->parent_node=parent_node;
    this->path_cost=path_cost;
    this->heuristic_cost=heuristic_cost;
    this->total_cost=total_cost;
    this->depth=depth;
}

Пока все работает нормально, но я не могу создать объект Node с NULL parent_node. Я пробовал это:

Node *n = new Node("state name",NULL,0,15,20,1);

Я также пытался создать новый объект и назначить его в качестве parent_node, но также безуспешно.

Node *temp = new Node();
Node *n = new Node("state name",temp,0,15,20,1);

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

Заранее спасибо

Ответы [ 4 ]

6 голосов
/ 18 сентября 2009

Ваш constructor public?

class Node
{
public:
    Node(std::string,Node *,int,int,int,int);
private:
    std::string state;
    Node* parent_node;
    int total_cost;
    int path_cost;
    int heuristic_cost;
    int depth;  
};

Кроме того, не забывайте точку с запятой после объявления Node, это не Java;)

1 голос
/ 18 сентября 2009

Это прекрасно работает для меня в GCC-4 в Mac OS X после исправления опечаток и реализации конструктора Node :: Node (). Вероятно, было бы полезно, если бы вы отредактировали свой вопрос, включив в него весь код тестовой программы, а также сообщения об ошибках, которые вы получаете при компиляции.

1 голос
/ 18 сентября 2009

Я думаю, что нормально указывать 0 для значения нулевого указателя вместо NULL (NULL - это макрос, используемый для C, который, в зависимости от того, как определяется макрос, может не работать с C ++) .

Кроме того, мне не нравится видеть std::string в качестве типа параметра. Я предпочел бы видеть либо const char*, либо const std::string&.

Также Node* node = new Node(); вызовет эту ошибку компилятора, потому что когда вы объявляете конструктор не по умолчанию, вы скрываете конструктор по умолчанию (где под «конструктором по умолчанию» я подразумеваю конструктор, который не принимает параметров). Если вы хотите поддерживать new Node();, вам нужно явно объявить конструктор по умолчанию (и определить, как он реализован).

0 голосов
/ 18 сентября 2009

Следующие компиляции отлично для меня:

// Added this.
#include <string>


class Node
{    public:
          Node(std::string,Node *,int,int,int,int);
    private:
          std::string state;
          Node* parent_node;
          int total_cost;
          int path_cost;
          int heuristic_cost;
          int depth;
}; // Added semicolon here

Node::Node(std::string state,Node *parent_node,
           int path_cost,int heuristic_cost,int total_cost,int depth)
{
        this->state=state;
        this->parent_node=parent_node;
        this->path_cost=path_cost;
        this->heuristic_cost=heuristic_cost;
        this->total_cost=total_cost;
        this->depth=depth;
}

// Put code inside main.
int main()
{
    Node *n = new Node("state name",NULL,0,15,20,1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...