下面的代码有一个类屏幕。成员:光标位置,屏幕宽度,屏幕高度和屏幕内容。它有另一个类Window_mgr,列表是屏幕的集合。每个屏幕在向量中都有一个特定的位置。 我会用箭头标记代码中的行,这样您就不需要查看完整的代码了。
我的问题是,当我们列出初始化向量(假设为int)时,我们只需通过以下方式执行此操作:
std::vector<int> ivec{1, 2, 3, 4};
但是在下面的代码中我正在初始化对象类型Screen的向量。这意味着什么:
VECTOR screens = VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }};
我只谈论列表初始化中的成员。即屏幕(24,80,&#39;&#39;)和屏幕(32,56,&#39; r&#39;)。他们是否为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;
}
答案 0 :(得分:2)
在C ++中,使用方法调用(实质上是创建类的匿名实例)来构造类的实例是完全有效的。所以语法
VECTOR{ {Screen(24, 80, ' '), Screen(32, 56, 'r') }}
正在使用VECTOR
的两个实例初始化Screen
。它还将其生命周期与VECTOR
的生命周期联系起来,而无需复制;它们可以move
安全,因为它们的范围只是构造函数调用。