Можно ли заставить конструктор класса принимать только new параметр?

Мне нужно реализовать иерархию классов, каждый содержит указатель на какой-то еще. И я хочу, чтоб при вызове конструктора, мои классы использовали только новую память. Возможно, я неверно формулирую, требуется следующее:

MyClass myobj(new AnotherClass());

То есть я хочу, чтоб можно было лишь так инициализировать объект и никак не:

AnotherClass* anotherobj = new AnotherClass();
MyClass myobj(anotherobj);

Хочу я так потому, что нужно избежать ситуации, когда мой класс проинициализирован указателем, который может быть удален вне объекта (тем самым уничтожив данные в моем объекте).

UPD: условие задачи: введите сюда описание изображения

введите сюда описание изображения Выделил красной рамкой условие, которое и заставило меня писать вопрос.


Ответы (1 шт):

Автор решения: maestro

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

struct AnotherClass{};

struct MyClass{
    MyClass(AnotherClass *&&c):
        c{c}  //Если бы передавалась правосторонняя ссылка на объект AnotherClass, а не на указатель, то лучше написать так: c{std::move(c)}
    {}
    
    AnotherClass *c;
    
};

int main()
{
    MyClass myobj(new AnotherClass());

    AnotherClass* anotherobj = new AnotherClass();
    MyClass myobj1(anotherobj); //Ошибка: cannot bind rvalue reference of type ‘AnotherClass*&&’ to lvalue of type ‘AnotherClass*’
    
    return 0;
}

Другой вопрос, что раз вы не проходили unique_ptr, то и rvalue references, наверное, тоже.

→ Ссылка