Убедитесь, что возвращаемое значение не является указателем

Я хочу убедиться, что в GetConnections метод я возвращаю точную копию connections, Я буду редактировать его за пределами существующего узла, и моя программа, скорее всего, перестанет функционировать, если вернет указатель на ячейку памяти (таким образом редактируя вектор узла). Как я могу убедиться, что я возвращаю клон / копию, а не указатель?

std :: vector<NodeConnection*> Node :: GetConnections()
{
return this->connections;
}class Node {
private:
std :: vector <NodeConnection*> connections;
public:
// getters
std :: vector <NodeConnection*> GetConnections();
};

NodeConnection* в самом векторе не будет редактироваться, так что это не проблема здесь.

1

Решение

Вы можете сказать, что вы возвращаете, посмотрев на сигнатуру функции:

  1. SomeType* functionName(ArgType arg) — функция возвращает указатель. Независимо от того, на что указывает указатель, вызывающий может изменить его.
  2. SomeType const * functionName(ArgType arg) — функция возвращает указатель на const, Независимо от того, на что указывает указатель, его можно проверить, но вызывающий не может изменить его.
  3. SomeType& functionName(ArgType arg) — функция возвращает ссылку. Независимо от ссылки, ссылка может быть изменена вызывающей стороной.
  4. const SomeType& functionName(ArgType arg) — функция возвращает const ссылка. Независимо от ссылки, ссылка может быть проверена, но вызывающая сторона не может ее изменить.
  5. SomeType functionName(ArgType arg) — функция возвращает копию. Любые изменения, которые может сделать вызывающая сторона в возвращаемом значении, не будут отражены в возвращаемом оригинале.

Тип возврата вашей функции — это пятый тип — вы возвращаете по значению, т. Е. Ваш код создает копию вектора указателей. Следует отметить, что хотя вызывающие не могут изменять вектор внутри вашего класса, они, безусловно, могут вызывать методы для объектов, на которые указывают элементы вектора. Если некоторые из этих методов вносят изменения в элементы, элементы в исходном векторе также увидят эти изменения. Другими словами, когда вы копируете вектор указателей, вы получаете мелкий копия.

Также обратите внимание, что нет необходимости возвращать копию, если все, что вы хотите, — это предотвращение модификации: возврат указателя на const или const Ссылка приведет к тому же результату с более высокой эффективностью, потому что копия будет избегаться.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector