Как поместить объект в узел, если у объекта нет конструктора по умолчанию, и мне не разрешено создавать его внутри определения класса? - PullRequest
1 голос
/ 30 ноября 2011

Хочу сразу отметить, что я уже искал сайт и не нашел подобной проблемы.Были вопросы о том, что кто-то не может поместить объект в узел, но моя проблема заключается в следующем:

Я не могу поместить объект внутри узла И мне не разрешено создавать конструктор по умолчанию для объекта (по крайней мере, не в определении класса)

Более конкретно:

Мне дали следующий класс Employer:

class Employer
{    
public:

    Employer(string x, int a, int b, int c);

    string getname() const { return name; }

private:
    string name;
    int age, sal, hire;
};

Employer::Employer(string x, int a, int b, int c) : name(x), age(a), sal(b), hire(c) { }

Как вы можете видеть, по умолчанию нет конструктора дляэтот класс, и мне не разрешено создавать его (это правила ..!)

И я создал следующий класс Node:

class Node
{
public:
    Employer emp;
    Node* link;
    Node(Employer);
};

Node::Node(Employer x)
{
    emp= x;
    link=NULL;
}

, как вы можете видеть, я хочусоздайте класс Node, который содержит указатель узла и объект Employer внутри него.

К сожалению, это не работает.Я продолжаю получать следующее сообщение об ошибке:

E2279: Не удается найти конструктор по умолчанию для инициализации члена .....

В основном это происходит потому, что у класса Employer нет конструктора по умолчанию, "Employer emp;"в классе Node не «распознается» компилятором, как если бы он был «int n» вместо «emper emp».

Поэтому мой вопрос таков:

Как я могу поместить объект Employer в узел без изменения / добавления чего-либо в класс Employer (т. Е. Я не могу добавить конструктор по умолчанию к классу Employer, и при этом я не могу добавить что-то вроде «Friend Class Node», правиладолжен оставить класс Employer как есть)

Поскольку я новичок в программировании, я хотел бы добавить, что меня еще не учили шаблонам, поэтому мне не разрешено использовать что-либо из этого, толькоинструменты, которые я вам уже дал (классы, функции, указатели и т. д.)

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Предоставьте явный вызов конструктора для члена Employer в списке инициализатора:

class Node
{
public:
    Employer emp;
    Node* link;
    Node(Employer e) : emp(e) { }
};

В этом примере я решил использовать конструктор copy , который вы не делали.Я определенно определю для Employer, но в любом случае.Как правило, вы предпочитаете принимать аргумент с помощью const-reference:

Node::Node(Employer const & e) : emp(e), link(NULL) { }

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

Node::Node(std::string const & s, int d) : emp(s, 12, d, 24), link(NULL) { }

(Чем меньше вы вкладываете в конструктор тело лучше.)

2 голосов
/ 30 ноября 2011
Node::Node(Employer x) : emp(x) {
}
1 голос
/ 30 ноября 2011

В настоящее время вы по умолчанию создаете элемент emp (или пытаетесь), а затем присваиваете ему Employer x.Даже если бы вы могли создать его по умолчанию, было бы расточительно это сделать, а затем перезаписать, когда вы могли бы просто правильно его настроить.

Использовать

Node::Node(Employer x) : emp(x), link(NULL)
{
}

вместо.Это дает emp и link правильные значения сразу.

...