C ++ - 返回C ++ 11 std :: array

时间:2017-05-15 08:54:32

标签: c++ arrays c++11 reference

我有一些类似的代码

#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,因为我想将数据保存在二进制文件中
  • 在我的实际代码中,我使用char [],而不是字符串

2 个答案:

答案 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。它几乎没有开销,并且隐藏了客户不感兴趣的信息。