【问题标题】:Initialization of 2D array data member二维数组数据成员的初始化
【发布时间】:2014-02-19 15:02:41
【问题描述】:

我有一个这样的程序:

class A {
  int a[2][3];
 public:
  A(int b[2][3]): a(b) {};
};

int main() {
  int b[2][3];
  A myclass(b);
  return 1;
}

编译器说:

1.cpp: In constructor 'A::A(int (*)[3])':
1.cpp:5:22: error: incompatible types in assignment of 'int (*)[3]' to 'int [2][3]'

为什么它们不兼容?如何通过另一个数组 b 初始化数组 A::a?

【问题讨论】:

    标签: c++ arrays assignment-operator data-members


    【解决方案1】:

    int a[2][3] 基本上是一个常量指针。不能分配给常量指针。您只能复制完整内容。如果你只需要复制指针,你需要声明一个指针而不是数组:

    class A {
      int (*a)[3];
     public:
      A(int b[2][3]): a(b) {};
    };
    

    【讨论】:

    • 为什么会有一个公共指针a 指向类外的数组?这个类不是用正确的面向对象设计创建的。使用 C++ 编程时始终努力使用 OO。
    • @Lundin,好的。我解决这个问题。但这是一个小例子……除了错误,我什么都不在乎。
    • 是的,OO 问题不仅仅是私有封装,还在于你的类不是自治的。您的类和调用者之间存在依赖关系,其中类必须知道和/或要求外部世界的事物按预期运行。在某些情况下,这是一种合理的方法,但在大多数情况下,这样的设计是有问题的。
    【解决方案2】:

    由于历史原因,内置数组类型是相当不方便的二等类型,不能复制或按值传递给函数。相反,它们倾向于衰减为指针;尽管有语法,但您的构造函数参数实际上是一个指针,相当于

    A(int (*b)[3])
    

    因此错误消息抱怨指针无法分配给数组。

    您可以将数组包装在一个类中,制作更方便的可复制类型;在 C++11 中,标准库已经提供了这样一个array 模板:

    typedef std::array<std::array<int,2>,3> array;
    array a;
    A(array const & b) : a(b) {}
    

    如果你真的想坚持使用内置数组,那么你需要通过steam复制数据:

    A(int b[2][3]) {std::copy(b, b+3, a);}    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多