在类的私有部分中声明数组

Der*_*rek 5 c++ arrays compiler-errors private-members

我有一个类,并且该类的输入的一部分是可变长度的向量(称为数据)(假设它具有长度N).我在功能后包含了这个:

    N = data_->size();
Run Code Online (Sandbox Code Playgroud)

在类的私有部分,我想声明一个数组double A[N][N];.但是,当我尝试这样做时,我会说些什么

错误:"N不是类型名称,静态或枚举器".

如何创建阵列A[N][N]

对不起,如果已经在其他地方解释过,因为我对c ++很新,所以甚至不知道该找什么!

编辑 - 附加代码:

    class foo {     
    public:
        foo (std::vector &data)
    : data(data_)
    {
        N = data_->size();
        M =  /* four times the last member of data (which is a vector of positive integers)*/
    }

    private:
      double A[M][M];

    void foo(void)
    {
      for (std::size_t i=1; i<=M; ++i)
        {
          A[i][i] = 1;
        }
    }
    };
Run Code Online (Sandbox Code Playgroud)

希望有某种意义......我怎么能定义A [M] [M]?也许它不可能为M做,因为M是数据的函数.如果M不可能,N可能吗?

我能想到的一个可能性是,我可以制作A a std::vector< std::vector<double> > A然后将很多0或其他东西压入其中,然后修改值......

小智 5

如果您使用std :: vector类,则必须使用以下句子在data_类的函数中创建向量(例如构造函数):

A = vector<vector<double> >(N, vector<double>(N, 0));
Run Code Online (Sandbox Code Playgroud)

括号的第一个参数是向量的大小,第二个是它上面的数据类型.

对不起我的英语,我是西班牙语,我的英语不是很好.


dmc*_*kee 1

嗯...这里有几个问题...

  • N均未M声明(在构造函数中或作为 的成员foo
  • data您正在尝试初始化未声明的成员(您可能的意思data_(data)是语法是member(expression),而不是expression(member))
  • 构造函数的参数是不完整的类型:它需要是std::vector< sometype >; 如果你希望它是通用的,你需要使用模板或从 boost 获得一些帮助
  • 您没有初始化您声明的唯一成员变量 ( A)
  • void foo(void)是一个问题,因为它不是构造函数(没有类型)的正确语法,而是使用类名

让我们构建更接近您想要的东西

从一堂课开始foo

class foo {
};
Run Code Online (Sandbox Code Playgroud)

构造函数采用单个类型参数std::vector<double>

class foo {
public:
  foo(std::vector<double> &data);
};
Run Code Online (Sandbox Code Playgroud)

你想用数据初始化一个成员变量

class foo {
private:
  std::vector<double> data_;
public:
  foo(std::vector<double> &data)
    :data_(data)
  {};
};
Run Code Online (Sandbox Code Playgroud)

在这一点上,我会注意到,我通常不会将非平凡构造函数的定义放在类声明中,而是放在实现文件中,因此我可以将成员变量的声明放在公共部分下面与构造函数的声明。但为了简洁起见,我将在这里保留这种方式。

您想要捕获并存储数据的大小

class foo {
private:
  std::vector<double> data_;
  size_t N;
 public:
  foo(std::vector<double> &data)
    :data_(data)
    ,N(data.size())
  {};
Run Code Online (Sandbox Code Playgroud)

};

此时,我们还没有制作出您想要的多维存储,但是现在您需要做出一些有关如何管理存储的决定。如果你使用Kerrek SB 的方法,这看起来像

class foo {
private:
  std::vector<double> data_;
  size_t N;
  std::vector< std::vector<double> > A;
public:
  foo(std::vector<double> &data)
    :data_(data)
    ,N(data.size())
    ,A()
  {
    A.resize(N);
    for (size_t i=0; i<N; ++i) {
      A[i].resize(N);
    }
  };
};
Run Code Online (Sandbox Code Playgroud)