Почему я получаю эту ошибку?"Ребенок не объявлен? - PullRequest
0 голосов
/ 23 января 2019

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

Я получаю эту ошибку, что «дочерний класс необъявлен»в базовой функции «void addChild (string nm, string sm)» в классе Parents (базовый класс).Я понимаю, что это может выходить за рамки базового класса.Может ли кто-нибудь предоставить мне решение этой проблемы, когда я все еще смогу создать экземпляр объекта производного класса из базового класса.Я хочу, чтобы все было сделано в базовом классе.Пожалуйста, уточните, если это нормально и является хорошей практикой.Если нет, пожалуйста, предложите несколько идей.

Вот мой код:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Parents // base class
{
    vector <Parents*> fam;

protected:
    string firstName;
    string lastName;
public:
    Parents()
    {
        //default constructor              
    }
    Parents(string fn, string ln)
    {
        firstName = fn;
        lastName = ln;
    }
    void displayChildren()
    {
        if (fam.empty())
        {
            cout << "Vector is empty" << endl;
        }
        else
        {
            for (unsigned int i = 0; i < fam.size(); i++)
            {
                std::cout, fam.at(i);
            }
        }
    }
    void displayParentsInfo(Parents& const par)
    {
        cout << "First name : " << par.firstName << endl;
        cout << "Last name  : " << par.lastName << endl;
    }
    void addChild(string nm, string sm)
    {
        Child* c1 = new Child(nm, sm);      
        fam.push_back(c1);
    }
};

class Child : public Parents //derived class
{
    string firstname;
    string surname;

public:
    Child()
    {
        //default constructor
    }
    Child(string a, string b)
    {
        firstname = a;
        surname = b;
    }
    //~Child()
    //{
        //destructor called
    //}
    void displayChildInfo(Child & const c)
    {
        cout << "Child's firstname : " << c.firstname;
        cout << "Child's surname   : " << c.surname;
    }
};

Ура!

1 Ответ

0 голосов
/ 23 января 2019

Просто переместите определение функции из определения класса:

class Parents // base class
{
  ...
  void addChild(string nm, string sm);
};

class Child : public Parents //derived class
{
  ...
};

void Parents::addChild(string nm, string sm)
{
    Parents* c1 = new Child(nm, sm);      
    fam.push_back(c1);
}

Что касается хорошей практики, может быть лучше иметь функцию, не являющуюся членом, которая подготавливает Child ивозвращает указатель на него и добавляет что-то вроде:

void Parents::addToFam(Parents* c1)
{
    fam.push_back(c1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...