【问题标题】:[C++]Assinging an array a size during constructor[C++]在构造函数期间为数组分配大小
【发布时间】:2014-11-28 01:12:12
【问题描述】:

老实说,在构造函数的调用过程中,我一直纠结于如何分配数组的大小。另外,我希望数组是“常量”。这在构造函数期间可能吗?还是我必须做一些更棘手的事情?以下是部分代码:

class CustomBitmap
{

public:
    CustomBitmap(int width,int height);
    ~CustomBitmap(void);
private:
    const int m_width;
    const int m_height;
    char const m_components[]; 

};

/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// /////////////////

#include "CustomBitmap.h"


CustomBitmap::CustomBitmap(int width,int height) : m_width(width),  m_height(height)
// How do I implement the array? none of the syntax works, I tried m_components([width * height *4]) and all sorts of things along that line.
{}  
CustomBitmap::~CustomBitmap(void) {}

【问题讨论】:

    标签: c++ arrays constructor


    【解决方案1】:

    数组具有固定大小(至少在标准 C++ 中),因此您不能在运行时为其分配大小,而必须在编译时指定其大小。

    如果您想要可变大小,请根据您的情况使用std::vector

    std::vector<char> m_components;
    

    如果向量是const,那么你将无法更改/附加到它,所以我真的不明白制作它const 的意义,除非你在类中简单地初始化它(C ++11) 例如

    const std::vector<char> m_components(10, 'a'); // const char vector of 10 a's
    

    const std::vector<char> m_components = {'a','b','c'}; // again C++11 in class initialization
    

    你也可以这样做

    template<int N>
    class CustomBitmap
    {
        ...
       char m_compontents[N];
    }
    

    但同样,这是一个模板类,您必须在编译时为其指定模板参数N,即将其实例化为例如

    CustomBitmap<5> my_custom_bitmap; // now m_components has size 5
    

    【讨论】:

    • 谢谢,我刚刚测试了它,它有效,你是最好的人! :)
    • 我绝对不是这里最好的,但很高兴它有帮助!
    【解决方案2】:

    这种语法:

    m_components([width * height *4])
    

    将被称为可变长度数组。 VLA。这是 C99 规范。 你不能在这里这样做,因为它存在于你的类型中,这会使类型大小本身可变,这是不可能的,因为它不是模板。

    你可以用一个完整的参数来做模板(而不是typename你使用int)然后你就可以做你想做的事了。

    但是,您不应该这样做,因为您的类型会变得巨大,这是一个坏主意,因为自动分配的类型可能在堆栈上,这将很快突破限制并导致许多低效率,因为编译器不是用来堆积膨胀。

    您需要在堆上分配,使用std::vector 是这里的最佳答案。稍后还要注意 std::array&lt;T,N&gt; 类型的存在是为了执行我在第一段中描述的操作。

    【讨论】:

    • 不理解您的评论“但是,您不应该这样做,因为您的类型会变得巨大”。你什么意思?如果您使用它 1000 次(具有 1000 种不同的大小),那么是的,目标代码将实例化 1000 个类并且会变得非常大。但是,如果您在编译时对尺寸规范没问题,那么模板解决方案应该可以使用。
    • 类型本身不会增加二进制大小,除非它存在于静态空间中!我说的是sizeof(the type)
    • 不就是N + sizeof(rest)吗?和sizeof(array&lt;char,N&gt;) + sizeof(rest)一样吗?也许我误解了你的评论。
    • @vsoftco: 绝对是:) 但是请检查 OP 试图做什么的语义,他想存储图像!他的N 将是height * witdh 通常这是数百万,您是否建议在堆栈上占用多个兆字节?你知道有些设备默认只给你 24kB 的堆栈空间。 (iOS)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2019-11-26
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多