不能使用string(size_t,char)构造函数

时间:2016-07-03 10:25:47

标签: c++ string c++11 constructor

我有一个类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'

2 个答案:

答案 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,则编译器将不会执行变量定义中的初始化。所以 - 正如你在一篇评论中所说的那样 - 你不能进行默认初始化,然后在构造函数中覆盖它。