Я хочу быстро реализовать то, что некоторые называют «указателем владельца», то есть интеллектуальным указателем, обеспечивающим уникальную семантику собственности, предоставляя при этом указатели «наблюдателя», которые не поддерживают объект живой, но может проверить, есть ли это.Forbid copy-construction базового класса
Самый простой способ, которым я пытаюсь это сделать, - это подкласс std::shared_ptr
и отключить его конструкцию копирования, чтобы ни один другой указатель не мог фактически обмениваться объектом.
Это то, что я имею сейчас:
#include <memory>
#include <iostream>
template <class T>
struct owner_ptr : public std::shared_ptr<T> {
// Import constructors
using std::shared_ptr<T>::shared_ptr;
// Disable copy-construction
owner_ptr(owner_ptr<T> const&) = delete;
// Failed attempt at forbidding what comes next
operator std::shared_ptr<T> const&() = delete;
};
struct Foo {
Foo() {
std::cout << "Hello Foo\n";
}
~Foo() {
std::cout << "G'bye Foo\n";
}
void talk() {
std::cout << "I'm talkin'\n";
}
};
owner_ptr<Foo> fooPtr(new Foo);
int main(int, char**) {
// This should not compile, but it does.
std::shared_ptr<Foo> sptr = fooPtr;
// Simple tests
fooPtr->talk();
(*fooPtr).talk();
// Confirmation that two pointers are sharing the object (it prints "2").
std::cout << sptr.use_count() << '\n';
}
Я потянув мои волосы на это. Как запретить копирование конструкции std::shared_ptr
с моего owner_ptr
? Я не люблю наследовать в частном порядке, а затем импортировать все от std::shared_ptr
...
Вы действительно хотите использовать композицию вместо наследования здесь. Особенно не публичная база. Это источник всех ваших проблем. – Deduplicator
@Deduplicator Я бы перенаправил все сказанному члену, что совершенно так же, как и в моем последнем предложении. Я сделал бы это в крайнем случае, если ничего не поделаешь, но я не люблю этого. – Quentin
Итак, вы хотите создать что-то вроде 'std :: unique_ptr'? –