我有一些类似的代码
#define SIZE 10
Class User
{
public:
std::array<Account, SIZE> getListAccount()
{
return listAccount;
}
private:
std::array<Account, SIZE> listAccount
}
Class Account
{
public:
void setUserName(std::string newUSN)
{
userName=newUSN;
}
private:
string userName;
string password;
}
int main()
{
User xxx(.......);
xxx.getListAccount()[1].setUserName("abc"); // It doesn't effect
return 0;
}
为什么main中的setUserName()
函数调用不会更改xxx
用户中的名称?
顺便说一下:
std::array
,因为我想将数据保存在二进制文件中答案 0 :(得分:5)
返回对列表的引用
std::array<Account, SIZE> & // << Note the &
User::getListAccount();
或者更好,不要暴露内部结构
Account&
User::getUser(size_t n)
{
return listAccount[n];
}
答案 1 :(得分:0)
std::array<Account, SIZE> getListAccount() const {
return listAccount;
}
这将返回数组的副本。
std::array<Account, SIZE>& getListAccount() {
return listAccount;
}
std::array<Account, SIZE> const& getListAccount() const {
return listAccount;
}
返回对数组的引用。
template<class T>
struct span_t {
T* b = 0; T* e = 0;
span_t()=default;
span_t(T* s, T* f):b(s),e(f){}
span_t(T* s, std::size_t l):span_t(s, s+l){}
T* begin() const{ return b; }
T* end() const{ return e; }
T& operator[](std::size_t i)const{ return begin()[i]; }
std::size_t size() const { return end()-begin(); }
bool empty() const { return begin()==end(); }
};
span_t<Account> getListAccount() {
return {listAccount.data(), listAccount.size()};
}
span_t<const Account> getListAccount() const {
return {listAccount.data(), listAccount.size()};
}
这将返回一对指针的包装器,这对指针代表一个连续的帐户范围,而不会暴露用于存储帐户的基础数据结构。
在这三个中,我使用span_t
。它几乎没有开销,并且隐藏了客户不感兴趣的信息。