c – 如何初始化类对象的向量

下面的代码有一个类屏幕.成员:光标位置,屏幕宽度,屏幕高度和屏幕内容.它有另一个类Window_mgr,列表是屏幕的集合.每个屏幕在向量中都有一个特定的位置.我将用箭头标记代码中的行,这样您就不需要查看完整的代码.

我的问题是当我们列出初始化向量(假设为int)时,我们只需通过以下方式执行此操作:

的std ::矢量< INT> ivec {1,2,3,4}; 但是在下面的代码中我初始化了对象类型Screen的向量.这意味着什么: VECTOR屏幕= VECTOR {{Screen(24,80,”),Screen(32,56,’r’)}}; 我只谈论列表初始化中的成员.即屏幕(24,80,”)和屏幕(32,56,’r’).他们是否为Screen类调用构造函数的版本?如何在不创建对象的情况下调用构造函数根据我的说法应该是: {Screen sr1(24,80,”),Screen sr2(32,56,’r’)} 要不就 {(24,80,”),(32,56,’r’)} 我通过互联网进行搜索,但无法获得这个概念.谢谢

#include <iostream>
#include <string>
#include <vector>

class Screen{
public:
    using pos = std::string::size_type; 

    Screen() = default; 
    Screen(pos ht, pos wd, char c) : 
        height(ht), width(wd), contents(ht *wd, c)  //in-class initializer
    {}

    char get() const { return contents[cursor]; }
    inline char get(pos ht, pos wd) const;

    Screen &set(char);
    Screen &set(pos, pos, char);

    Screen &move(pos r, pos c); 

    void some_member() const; 

private:
    pos cursor = 0; 
    pos height = 0, width = 0; 
    std::string contents; 
    mutable size_t access_ctr;
};


inline Screen &Screen::set(char c)
{
    contents[cursor] = c; 
    return *this; 
}

inline Screen &Screen::set(pos r, pos c, char ch)
{
    contents[r*width + c] = ch; 
    *this; 
}


void Screen::some_member() const
{
    ++access_ctr; 
}

inline Screen &Screen::move(pos r, pos c)
{
    pos row = r *width; 
    cursor = row + c; 
    return *this;
}

char Screen::get(pos r, pos c) const
{
    pos row = r * width;  
    return contents[row + c];
}    

//---------------------------------
class Window_mgr{
private:
    using VECTOR = std::vector<Screen> ;
    // A Window Manager has has one standard sized blank Screen
    VECTOR screens = VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }};  // <-----------------

};
//---------------------------------

int main()
{
    Screen scr{13, 33, 'c'};

    std::cout << scr.get(3, 1); 

    Window_mgr win{}; 


    return 0; 
}

最佳答案 在C中,使用方法调用(实质上是创建类的匿名实例)构造内联类的实例是完全有效的.所以语法

VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }}

正在使用两个Screen实例初始化VECTOR.它还将其生命周期与VECTOR的生命周期联系起来,而无需复制;它们可以安全地移动,因为它们的范围只是构造函数调用.

点赞