我有一个类Screen
,其成员内容使用std::string(size_t, char)
构造函数初始化。
#include <iostream>
#include <string>
struct Screen {
friend std::ostream& print(std::ostream& os ,const Screen& screen);
Screen() = default;
Screen(std::size_t w, std::size_t h) :
width(w), height(h), content(w * h , ' ') {}
Screen(std::size_t w, std::size_t h, char c) :
width(w), height(h), content(w * h, c) {}
private:
std::size_t width = 24;
std::size_t height = 80;
std::size_t cursor = 0;
std::string content(width * height, ' ');
};
我尝试在main中以类似的方式声明一个字符串,但是我得到了同样的错误,我无法弄清楚我在这里做错了什么。
structures.cpp:15:25: error: 'width' is not a type
std::string content(width * height , ' ');
^
structures.cpp:15:42: error: expected identifier before '\x20'
std::string content(width * height , ' ');
^
structures.cpp:15:42: error: expected ',' or '...' before '\x20'
答案 0 :(得分:2)
以下修复了您的代码。我想在成员函数声明和成员数据定义之间需要一点消歧:
std::string content = std::string(width * height, ' ');
但是我要做的不是在构造函数中重复自己,而是使用委托构造函数和默认参数:
struct Screen
{
Screen(std::size_t w, std::size_t h, char c = ' ') :
width(w),
height(h),
content(w * h, c)
{}
Screen() :
Screen(24, 80)
{}
private:
std::size_t width;
std::size_t height;
std::string content;
};
你已经完成了。
答案 1 :(得分:1)
我从未使用过这种语法,但看起来你可以按如下方式初始化类体内的std :: string:
std::size_t width = 24;
std::size_t height = 80;
std::size_t cursor = 0;
std::string content{std::string( (width * height), ' ')};
你应该记得如上所述保持初始化顺序。
代码的问题在于,如果在构造函数初始化列表中初始化content
,则编译器将不会执行变量定义中的初始化。所以 - 正如你在一篇评论中所说的那样 - 你不能进行默认初始化,然后在构造函数中覆盖它。