【问题标题】:How do I write setters and getters for an array? (c++)如何为数组编写 setter 和 getter? (c++)
【发布时间】:2013-05-04 12:23:34
【问题描述】:

我在 C++ 中编写了一个类,但是我不确定如何为数组创建 setter 和 getter(对不起,这是一个基本问题!)我收到以下错误:

']' 标记之前的预期主表达式

这是我的代码:

Class planet: public body
{
private:
  string name[];
  string star[];
public:
  void nameSetter (string h_name[])
  {
      name[] = h_name[];
  }
};

再次为这个愚蠢的问题感到抱歉,我知道我没有通过索引,但是,当我创建索引时会引发大量错误!

【问题讨论】:

  • 您希望每个行星实例都有 1 个名称和 1 颗星吗?如果是这样,您不需要字符串数组,这就是您的名称和星号声明所暗示的内容。

标签: c++ arrays setter getter getter-setter


【解决方案1】:
string name[];

这不是一个数组,它是一个指针。请改用vectors

#include <vector>
class planet: public body
{
private:
  vector<string> name;
  vector<string> star;
public:
  void nameSetter (const vector<string> &h_name)
  {
      name = h_name;
  }
};

【讨论】:

  • 当我使用这个方法时,它会说以下错误:不兼容的类型在分配 'const std::vector<:basic_string>>' 到 'std::vector >[0]' 在声明 name = h_name; 的那一行
  • @BenjaminLindley:哦,是的,it is。也可以看看大名鼎鼎的int main(int argc, char *argv[])
  • @DamienRenner:This code compiles,所以错误一定来自你没有显示的代码的其他部分。
  • @ybungalobill: -pedantic-errors 如果您希望 GCC 强制执行该标准。是的,在函数参数中,它是一个指针,但这是不同的。在函数参数中,你甚至可以提供一个大小,它仍然是一个指针。
  • @BenjaminLindley:也许你是对的。在这里仍然适用于参数,extern string name[]; 作为静态存储的声明仍然是合法的。
【解决方案2】:

C++ 中的数组具有编译时固定大小。你不能有像string name[]; 这样的声明,因为它的大小是空的。除非您提供确定大小的初始化列表,否则您不能这样做。

此外,数组类型参数被转换为指针参数。所以你的string h_name[] 参数实际上是一个string* h_name

name[] = h_name[];

这条线没有多大意义。这几乎就像您试图在不提供索引的情况下访问 nameh_name 的元素。也许您打算将h_name 数组分配给name 数组,如下所示:

name = h_name;

然而,正如我们刚刚看到的,h_name 实际上是一个指针。事实上,你无论如何也不能分配给一个数组,所以即使h_name 是一个数组,这仍然行不通。

使用像std::vector 这样的标准容器会更好。看来您无论如何都想要动态大小的数组,所以这会很容易。

【讨论】:

    【解决方案3】:

    即使选择了答案,我认为可能最初的问题可能被误解了。

    我认为 OP 的意图是每个行星实例都应该有 1 个名称和 1 颗星;所以他在代码中使用的数组表示法是他对数组和字符串的误解。基于这个假设,我会继续。

    当你声明时

    string name[]; 
    

    我相信你只想保存 1 个行星的名称,在这种情况下你不需要和数组,你只需要一个字符串。 即

    string name;
    

    明星也是如此。

    这将使代码

    Class planet: public body
    {
    private:
      string name;
      string star;
    public:
      void nameSetter (const string& h_name)
      {
          name = h_name;
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多