Как ограничить создание объекта только через родительский объект класса? - PullRequest
0 голосов
/ 25 апреля 2018

Рассмотрим следующий пример.

class Parent
{
public:
    Child createChild();

// some member data and functions can go here.
}

class Child: public Parent
{
// some member data and functions can go here.
}

Я хотел бы разрешить создание класса "Child" только с помощью метода, предоставленного в классе Parent. То есть я хотел бы отказать пользователю в возможности создания экземпляра объекта класса Child. Я также хотел бы избежать всех других конструкций по умолчанию класса Child. Как это возможно?

Parent p;
Child c = p.createChild(); // should be possible
Child d; //should not be allowed
Child e = c; // may  be allowed

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вы можете сделать что-то вроде этого.

class Parent
{
public:
      static Parent* InstantiateParent(); // for completeness' sake
      static Child* InstantiateChild();
};

class Child : public Parent
{
    Child();
    Child(Child& other):
    Child& operator = (Child& other);

    friend class Parent;
public:
};

/* impl.cpp */

#include "header.hpp";

Child* Parent::InstantiateChild()
{
    return new Child;
}

Parent* Parent::InstantiateParent()
{
    return new Parent;
}

Хотя отделение творения от целевого класса посредством некоторой вариации фабричного шаблона имеет свои преимущества.

0 голосов
/ 25 апреля 2018

Вы можете сделать так, чтобы CreateChild () возвращала что-то, отличное от Child, которое может быть публично создано для Child.Вы платите за перемещение, потому что оно не подлежит копированию, а код является избыточным c ++ 17.

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

0 голосов
/ 25 апреля 2018

Вы можете сделать Child конструктор private, и иметь Parent::createChild быть friend из Child.


Do note комментарий StoryTeller в том смысле, что ваш конструктор копирования все еще должен быть публичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...