如何使用大小和值构造函数使用成员初始化器列表初始化用户定义对象的向量

Posted

技术标签:

【中文标题】如何使用大小和值构造函数使用成员初始化器列表初始化用户定义对象的向量【英文标题】:How to initialize a vector of user defined objects, with member initializer lists, using size and value constructor 【发布时间】:2021-04-30 02:51:52 【问题描述】:

首先,这是代码:

#include <vector>

enum class Color

    black = 0,
    white = 1,
;

class Pixel

private:
    Color m_color;
public:
    Pixel(Color color = Color::black)
        :m_color color 
    
    
;

class ScreenBuffer

private:
    std::vector<Pixel> m_screenbuffer;
    std::size_t m_width;
    std::size_t m_height;
public:
    ScreenBuffer(std::size_t width, std::size_t height) 
        :m_screenbuffer(width* height), m_width width , m_height height 
    
    
;

int main()
   
    ScreenBuffer main(10,10);
    return 0;

这是一个非常简单的屏幕缓冲区,由可以是黑色或白色的像素组成。

当前 ScreenBuffer 构造函数采用 2 个参数 width and height 并初始化 m_screenbuffer 向量成员,将其大小设置为 width*height 并为向量的每个元素调用 Pixel 构造函数。当前的 Pixel 构造函数,如果没有传入参数,默认将其 m_color 成员设置为 Color::black。

如果我想初始化传递参数的向量的每个像素,(例如对于这种情况 Color::white,或者使用另一个接受更多参数的构造函数),如何使用 ScreenBuffer 中的成员初始化器列表调用 THAT Pixel 构造函数类构造函数,如何在向量构造函数中输入像素构造函数所需的所有参数?

向量构造函数是m_screenbuffer(size,value),所以我尝试了:m_screenbuffer(width* height,Color::white),它成功了!但这没有意义,因为它应该期望 Pixel 对象而不是 Color 对象。还有...如果我的 Pixel 构造函数需要更多参数怎么办,传递这些参数的正确方法是什么?

我想知道执行此操作的正确方法以及它为什么以及如何工作,以便我可以更好地理解语义的逻辑。谢谢!

【问题讨论】:

m_screenbuffer(width* height, Pixel(some_color))? 它可以工作,但我不太明白它是如何工作的。例如,如果它是一个 int 值的向量,我只会放一个 int 文字。对于类,我直接调用该类的任何构造函数?没有任何实例吗?如果没有实例,构造函数不应该是静态的吗?我很迷茫。更多细节将不胜感激。 :D T(n) 是使用初始化器 n 创建 T 类型对象的语法 我在这里找到了我正在寻找的答案:learncpp.com/cpp-tutorial/anonymous-objects 有一个名为匿名对象的概念,它让我可以使用 Pixel(some_color) 作为右值并将其作为另一个构造函数的参数传递. 【参考方案1】:

我在这里找到了我正在寻找的答案:learncpp.com/cpp-tutorial/anonymous-objects 有一个名为匿名对象的概念,它让我可以使用 Pixel(some_color) 作为右值并将其作为参数传递另一个构造函数。

【讨论】:

以上是关于如何使用大小和值构造函数使用成员初始化器列表初始化用户定义对象的向量的主要内容,如果未能解决你的问题,请参考以下文章

可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?

C++ 初始化器列表功能:调用函数而不初始化成员?

函数try{}

C++:初始化成员变量(无参构造|有参构造|初始化列表)

如何在 C++ 子类的构造函数中初始化超类的 const 成员变量?

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)