Можно ли заставить конструктор класса принимать только new параметр?
Мне нужно реализовать иерархию классов, каждый содержит указатель на какой-то еще. И я хочу, чтоб при вызове конструктора, мои классы использовали только новую память. Возможно, я неверно формулирую, требуется следующее:
MyClass myobj(new AnotherClass());
То есть я хочу, чтоб можно было лишь так инициализировать объект и никак не:
AnotherClass* anotherobj = new AnotherClass();
MyClass myobj(anotherobj);
Хочу я так потому, что нужно избежать ситуации, когда мой класс проинициализирован указателем, который может быть удален вне объекта (тем самым уничтожив данные в моем объекте).
Выделил красной рамкой условие, которое и заставило меня писать вопрос.
Ответы (1 шт):
Передавайте указатель в конструктор через правостороннюю ссылку:
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, наверное, тоже.
