【问题标题】:c++ How to return a vector by reference?c++ 如何通过引用返回一个向量?
【发布时间】:2014-06-07 15:06:15
【问题描述】:

我是一名 C++ 学生,在理解和完成我的这部分作业时需要一些帮助。

我有一个SalesItem 对象的向量:

class Invoice
{
public:
    //blabla
    vector<SalesItem> *getSalesItems(); //code provided by the assignment.
private:
{
    //blabla
    vector<SalesItem> salesItems;
};

我需要返回那个向量作为参考:

void Invoice::getSalesItems() //error on this line. Code provided by assignment.
{
    return salesItems; //error on this line.
}

现在,我知道那些给我错误的东西显然是错误的,我什至没有任何指针或引用。我发布这几行代码只是作为我希望看到的示例(或者更实际地,对我有意义的示例。)

我想要一个 get 函数,它可以像其他 get 函数一样工作,用于 int 或 string 等类型,除了这个必须通过引用返回(根据分配的要求)。

不幸的是,我对向量和引用的理解不足以解决这个问题,而且我没有任何教育资源可以帮助我解决这个问题。如果有人可以帮助我了解该怎么做,我将不胜感激。

我们很乐意提供任何额外的信息。

【问题讨论】:

  • vector&lt;SalesItem&gt; *getSalesItems(); 返回一个指针而不返回一个引用。 void Invoice::getSalesItems() 不返回任何内容。类中的函数定义和声明必须一致:vector&lt;SalesItem&gt; &amp; getSalesItems();通过引用返回一个向量。

标签: c++ pointers vector reference header-files


【解决方案1】:

您需要指定返回类型。此外,最好同时提供constnon-const 版本。代码如下:

class Invoice
{
public:
          vector<SalesItem> &getSalesItems()       { return salesItems; }
    const vector<SalesItem> &getSalesItems() const { return salesItems; }
private:
    vector<SalesItem> salesItems;
};

示例用法:

Invoice invoice;
vector<SalesItem> &saleItems = invoice.getSalesItems(); // call the first (non-const) version
const Invoice &const_invoice = invoice;
const vector<SalesItem> &saleItems = const_invoice.getSalesItems(); // call the second (const) version

【讨论】:

  • 有点离题,但我一直认为这种技术(获取参考的“getter”)与仅让成员公开相比是毫无意义的混淆。
  • @MattMcNabb 在这种情况下我不提倡getter,但是让成员公开是一个更糟糕的选择。很好的讨论here
  • 那个讨论主要是关于按值返回的“getter”,甚至有一篇帖子说参考版本与拥有一个公共成员基本相同。 (唯一的区别是您不能在引用上形成指向成员的指针)。
  • 我同意 getter 返回引用不好,但公共成员更糟。从链接中引用:“因为一旦你开始制作 getter/setter,人们就会停止以批判的眼光来设计对象,哪些数据应该是可见的,哪些数据不应该是可见的。对于公共成员来说情况更糟,因为趋势变得公开一切。”
【解决方案2】:

您在函数实现中返回void。而且您也没有正确的声明来通过引用获得回报。

代码应该是这样的:

标题:

class Invoice
{
public:
    vector<SalesItem> &getSalesItems();
private:
    vector<SalesItem> salesItems;
};

实施:

vector<SalesItem> &Invoice::getSalesItems() {
    return salesItems;
}

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2019-07-10
    • 2013-07-07
    • 2011-03-14
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多