Я изучаю C++, и у меня есть небольшая проблема. У меня есть класс, который содержит vector<int>
. С внешней стороны это vector<int>
должно быть доступно, поэтому должно быть возможно добавить/удалить/получить его элементы.Доступ к объекту класса класса C++, но не позволяют его переопределить
Нельзя переопределить объект новым экземпляром. Вот такой пример класса (это minimalized):
class MyClass
{
public:
vector<int>& vec() { return _vec; }
private:
vector<int> _vec;
};
Э.Г. следующий код работает:
MyClass x;
x.vec().push_back(0);
x.vec().push_back(7);
x.vec().push_back(9);
cout << c.vec().size() << endl;
Но, к сожалению, следующий код работает:
MyClass x;
x.vec() = vector<int>();
Я хотел бы запретить это, но я сделал только найти решение, чтобы вернуть указатель типа vector<int> *
. Но я понял, что указатели являются «злыми», и я не должен использовать их напрямую, я должен использовать интеллектуальные указатели. Я думаю, что для этой проблемы умный указатель бесполезен, поэтому я не знаю, как решить эту простую проблему: -/
Или просто простой указатель на самое чистое решение?
наилучшими пожеланиями
Кевин
-edit-
В целом я хотел бы сделать что-то, что может быть использовано как follwing C# класс:
public class MyClass
{
public List<int> List { get; private set; }
public MyClass()
{
List = new List<int>();
}
}
Это просто пример и я просто подумал о том, как сделать это на C++. Может быть, в некоторых случаях у меня есть более сложные классы, чем vector<int>
/List<int>
для включения в другие классы.
Но, возможно, это возможно только путем определения собственных методов (= интерфейса) для внутреннего объекта.
Не возвращайте ссылку и добавьте специальную функцию для добавления значений? Наличие публичной функции, возвращающей ссылку на переменную-член, похоже на то, что переменная-член является общедоступной. –
Указатели не являются злыми, но здесь не помогают. Вы должны скрыть векторную деталь и предоставить правильный интерфейс для управления данными. – hansmaad
, если вы хотите разоблачить все методы вектора, не видите никакого вреда в том, чтобы разоблачить оператор присваивания (в этом случае вы также могли бы наследовать публикацию от вектора, что было бы проще). если вы хотите иметь контроль и разрешать публиковать только некоторые операторы скрыть вектор и написать свои собственные функции прокси – Yuval