【问题标题】:How to initialize an array class with constructor C++如何使用构造函数 C++ 初始化数组类
【发布时间】:2022-01-17 22:07:16
【问题描述】:

我正在尝试初始化一个类的数组,但如果我指定数组的每个对象,我只能这样做,例如:

class Pixel{
private:
    int color;
public:
    Pixel(int color):color(color){}
};

class Screen{
private:
    Pixel screen[1920][1080];   
public:
    Screen(){
    //code//
    //i was trying to use for, to determinate each pixel color from a certain area
    //but i cannot, bc i would have to do something like this:
    screen[1920][1080] = {{Pixel(1),Pixel(1),Pixel(1),Pixel(1)...1080 times},{Pixel(2)
    ,Pixel(2), Pixel(2)...1080 times}...1918 times}
    //as you can see, is nearly impossible to do this in this way.
    }
};

有没有用 fors 或类似的东西初始化这个数组的原生方法?

(该代码只是一个具有完全相同逻辑的示例,它不是来自我的项目)

【问题讨论】:

  • 您可以为您的Pixel 类编写一个默认构造函数。或者更好的是给你的ctor中的参数一个默认值
  • 使用 vector 而不是数组。
  • 另外,您的 2D 阵列的纵横比为 9:16,而您可能真的需要 16:9,例如电视和显示器等。
  • 您可以使用for 循环(实际上是两个嵌套)在构造函数中分配初始值

标签: c++ arrays class oop initialization


【解决方案1】:

您的代码有几个问题:

  1. 您的 Pixel 类型需要显式初始化。那是明智的吗? @perivesta 建议提供默认构造函数;或现有构造函数的默认参数。

    另一种选择是重新考虑您是否甚至需要一个合适的Pixel 类。也许仅仅拥有就足够了

    using Pixel = std::int32_t;
    

    或像素应该具有的任何大小。如果一个像素需要花哨的方法,那么一个包装基本值的结构,但不指定任何构造函数或析构函数,即使用rule of zero

  2. 正如@digito_evo 解释的那样 - 数组太大而无法放入堆栈;即使您能够初始化数组,您的程序也可能仅因为这个原因而崩溃。考虑让您的 Screen 类在堆上分配空间,例如通过std::unique_ptr 成员,或@NathanOliver 建议的std::vector(它们都在堆上分配)。

    阅读有关堆和堆栈的更多信息:What and where are the stack and heap?

  3. 使用幻数:1920、1080 - 不要只是输入它们,说出它们的含义...这些维度具有静态类 (constexpr) 常量。有关这一点的更多信息,请参阅C++ coding guideline against magic numbers

【讨论】:

    【解决方案2】:

    您的二维数组 screen 太大(大约 8 MB!!)无法放入堆栈。您当然不希望程序中出现堆栈溢出。因此请改用vector

    另外,color 变量不需要是int 类型。你真的打算用 32 位做什么?通常,8 位就足够了,所以我切换到unsigned char

    既然你想要一个 for 循环,那么看看这个:

    #include <vector>
    
    
    class Pixel
    {
    public:
        Pixel( const unsigned char color = 0 )
        : m_color( color )
        {
        }
    
    private:
        unsigned char m_color;
    };
    
    class Screen
    {
    public:
        Screen( const std::size_t rowCount = 1920, const std::size_t colCount = 1080 )
        : screen( rowCount, std::vector<Pixel>( colCount ) )
        {
            for ( std::size_t row { }; row < rowCount; ++row )
            {
                for ( std::size_t col { }; col < colCount; ++col )
                {
                    screen[ row ][ col ] = Pixel( static_cast<unsigned char>( row ) + 1 );
                }
            }
        }
    
    private:
        std::vector< std::vector<Pixel> > screen; // a vector of vectors
    };
    
    int main( )
    {
        Screen scrn;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多