【问题标题】:How to create a dynamically-allocated array of const objects, but have values assigned to them?如何创建一个动态分配的 const 对象数组,但为它们分配了值?
【发布时间】:2011-12-21 08:05:33
【问题描述】:

我需要创建一个动态分配的 const 对象数组。困难的是我也需要为 const 对象分配值。

this SFML class 的 Samples 变量需要这个。

我该怎么做?

【问题讨论】:

  • 正如@Mike Seymour 发现的那样,您可能没有正确理解自己的需要

标签: c++ arrays pointers constants sfml


【解决方案1】:

简单:

// Step 1: Make an array of const values:
const int arr[] = { 1, 4, 9, 17 };

// Step 2: Make a pointer to it:
auto        parr     = &arr; // 2011-style
const int (*pbrr)[4] = &arr; // old-style

您不能将值“分配”给常量(显然),因此赋予常量一个值的唯一方法是将其初始化为该值。

【讨论】:

  • *pbrr 周围的括号有什么作用?谢谢!
  • 对不起,忘了补充说我需要动态分配数组。
  • 第三步:盈利! (对不起,陈词滥调)
  • @sim642:动态常量数组只能在 C++11 中使用,因为您需要统一初始化才能对其进行初始化:const int * p = new int[3] { 1, 2, 3 };
【解决方案2】:

如果您需要动态分配的数组,我建议使用标准容器:

std::vector<Int16> data;
Chunk* c = ...;

data.push_back(...);

c->Samples = &data[0];

【讨论】:

  • 对不起,忘了补充说我需要动态分配数组。
【解决方案3】:

进行分配,将其分配给指向非常量的指针。对数据进行修改。当你做完这些事情后,你可以将你的 const 指针分配给数组。例如:

int * p = new int[100];
for (int i=0; i<100; ++i)
    p[i] = i;

const int * cp = p;

【讨论】:

    【解决方案4】:

    或者,如果在编译时数据未知:

    const std::vector<int> function() {
        std::vector<int> tmp(5); //make the array
        for(int i=0; i<5; ++i)
            tmp [i] = i; //fill the array
        return tmp;
    }
    

    【讨论】:

      【解决方案5】:

      您不需要const 对象的数组。指向 const 的指针可以指向 const 或非 const 对象;您可以像这样创建一个动态数组并从中初始化一个Chunk 结构:

      std::vector<Int16> samples;
      initialise(samples);
      
      // valid until 'samples' is destroyed or resized
      SoundStream::Chunk chunk = {&samples[0], samples.size()};
      

      【讨论】:

      • 啊,一个阅读了 OP 问题背景的人......并且毫不奇怪地发现 OP 不知道她需要什么!为此+1。 (生活的基本问题是看穿人们所说的他们想要什么并发现他们需要。我认为滚石乐队在可用性分析师流行之前就已经解决了这个问题。)
      • 感谢这个不错的 STL 解决方案。
      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多