【问题标题】:Dynamic array in a class in C++C++类中的动态数组
【发布时间】:2012-06-19 08:38:12
【问题描述】:

我有一个动态数组,我用我的类中的一个函数为它分配内存:

double *val;
int n; // dimension

void alloc (int nn) { // memory allocation for vector
    n = nn;
    val = new double[n];
}

但是当我尝试将数据放入 main 中时,我遇到了以下问题:

当我输入时:

a.val[3] = {1.0 , 1.0 , 1.0};

我收到以下非常模棱两可的错误:

syntax error : missing ';' before '{'
syntax error : '{'

但是当我输入时:

a.val[1]=1.0;
a.val[2]=1.0;
a.val[3]=1.0;

它工作得很好。有人知道为什么吗?

【问题讨论】:

  • 双精度数组。两者都应该做同样的事情,不是吗?我知道 a.val[3] = {1.0 , 1.0 , 1.0};版本一般是正确的..

标签: c++ dynamic array-initialization


【解决方案1】:

你只能用这种方式初始化一个数组:

double a[3] = {1.0, 1.0, 1.0};

你的选择是:

void alloc (int nn) { // memory allocation for vector
    n = nn;
    val = new double[n];

    // one option is:
    for (int i = 0; i < n; i++)
    {
        val[i] = 1.0;
    }    

    // or you can also do: (thanks to Benjamin)
    std::fill_n(val, n, 1.0);

    // or:
    std::fill(val, val + n, 1.0);
}

【讨论】:

  • 数组在类中初始化,我已经编辑了我的答案来显示。
  • @System 正如我在回答中所说,当您为其分配内存时,数组已经初始化,val = new double[n];
  • @System 看到这个,Initializer list for dynamic arrays?
  • 不是唯一的选择。有std::fillstd::fill_n
  • @BenjaminLindley 谢谢!我在答案中添加了替代方案。
【解决方案2】:

a.val[3] = {1.0 , 1.0 , 1.0};

这仅适用于初始化。

在您的情况下,您首先动态分配了初始化发生的空间。

这会起作用

float val[3]={1.0,1.0,1.0};

【讨论】:

  • 但我希望向量与特定对象链接,在本例中为 a。我该怎么做?
  • 你所说的确实有效,我为我的程序得到的结果是正确的,但是当我打印 a.val[1] 例如我得到一个非常大(而且错误)的数字。
【解决方案3】:

您只能使用 {data} 进行初始化 但如果您仍想使用它来设置多个值,请尝试以下操作:

double values[3] = {1.0, 2.0, 3.0};
memcpy(&(a.val), &values, sizeof(values));

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多