Если я вас правильно понимаю: вам нужна память из двух частей: вначале вы хотите что-то, чего нельзя коснуться, а после этого вам нужно что-то, что открыто для использования клиентским кодом.
Вы можете сделать что-нибудь по следующему коду.Это даст клиентскому коду копию для воспроизведения.Это означает, что вам придется много копировать.
class SomeClass
{
public:
std::vector<int> getMember( void ) const;
void setMember(std::vector<int> newContent);
private:
std::vector<int> member;
size_t magicOffset;
};
// Read restricted part
std::vector<int> SomeClass::getMember( void ) const
{
return vector<int>(member.begin() + magicOffset, member.end());
}
// Assign to restricted part
void SomeClass::setMember(const std::vector<int>& v)
{
std::copy(v.begin(), v.end(), member.begin() + magicOffset);
}
Чтобы избежать копирования, возможно, что вы могли бы выделить память для двух векторов, одного для защищенной части и одногодля незащищенной части и используйте размещение new, чтобы поместить оба вектора в эту память, таким образом гарантируя, что они находятся в смежной памяти.А затем предоставить клиенту код более или менее бесплатный доступ к публичной части вектора.Однако в vector
есть еще одна вещь с переменными учета, и в основном это будет ужасный хак, который просто ждет, чтобы взорваться.
Однако, если вам нужен доступ к неограниченной части только наэлемент базы, вы могли бы просто сделать проверку диапазона на аргументы, то есть:
int getElement(size_t idx)
{
idx += magicOffset;
if (idx > member.size() || idx < 0) throw std::out_of_range("Illegal index");
return member[idx];
}
И затем либо предоставить setElement
, либо вернуть int&
.