2 wangrand wangrand 于 2015.06.08 11:34 提问

C++primer 关于容器中的类的初始化

头文件Header.h:

 #ifndef FUNC
#define FUNC
#include<string>
#include<vector>
using namespace std;
class Screen;
class Window_mgr
{
public:
    friend class Screen;
    typedef vector<Screen>::size_type ScreenIndex;
    Window_mgr() = default;
    ScreenIndex addScreen(const Screen&);
    void clear(ScreenIndex);
private:
    vector<Screen> screens{Screen(24,80,' ')};
};
class Screen
{
    friend void Window_mgr::clear(ScreenIndex);
public: 
    typedef string::size_type pos;
    Screen() = default;
    Screen(pos ht, pos wd) :height(ht), width(wd){ contents = string(ht*wd, ' '); }
    Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht*wd, c){}
    char get()const { return contents[cursor]; cout << cursor << height << width; }
    inline char get(pos ht, pos wd)const;
    Screen &move(pos r, pos c){ cursor = r*width + c; return *this; }
    Screen &set(char c){ contents[cursor] = c; return *this; }
    inline Screen& display(ostream &);

private:
    pos cursor = 0;
    pos height = 0, width = 0;
    string contents;
};
inline
    Screen& Screen::display(ostream &co)
{
        co << contents;
        return *this;
    }
Window_mgr::ScreenIndex
Window_mgr::addScreen(const Screen&s)
{
    screens.push_back(s);
    return screens.size()-1;
}
void Window_mgr::clear(ScreenIndex i)
{
    Screen &s = screens[i];
    s.contents = string(s.height*s.width, ' ');
}
#endif

源文件source.cpp:

 #include<iostream>
#include"Header.h"
int main()
{
    Window_mgr ms;
    Screen myScreen(5, 5, 'X');
    myScreen.move(4, 0).set('#').display(cout);
    cout << "\n";
    myScreen.display(cout);
    cout << "\n";
    return 0;   
}

VS2013编译器提示 :
Error 1 error C2514: 'Screen' : class has no constructors c:\users\orgrand.w\documents\visual studio 2013\projects\demo\header.h 16 1 Demo

Error 2 error C1903: unable to recover from previous error(s); stopping compilation c:\users\orgrand.w\documents\visual studio 2013\projects\demo\header.h 16 1 Demo

光标指向这条语句: vector screens{Screen(24,80,' ')};
怎么修改才能实现这个初始化呢?

3个回答

liqiongfan
liqiongfan   2015.06.08 13:08

vector screens{Screen(24, 80, '')};这行是错误的哈。

vector的初始化只能是如下的几种:
1. vector v1;
2. vector v2(v1);
3. vector v3(n, i);
4. vector v4(n);
并没有使用vector Name{};的初始化形式,数组是这样初始化,但是容器不是这样初始化的。如:
数组初始化:
int a[] = {1,2,3,4};
容器初始化:
vector v1();而且不允许对容器使用vector v1 = {};的形式。


monaso
monaso   2015.06.08 16:03

把这句vector screens{Screen(24,80,' ')}换成vector screens(Screen(24,80,' '))试试。

oyljerry
oyljerry   Ds   Rxr 2015.06.08 22:00

你这个需要支持in class initialization。需要支持c++11的编译器

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++ primer ----static总结(转载)
地址:http://blog.csdn.net/mishifangxiangdefeng/article/details/7192809一、不在类中的static的使用1.作用1.局部变量被申明为static,表示这个函数结束的时候这个的值不变。2.外部变量被申明为static表明它是一个本地全局变量。改变量只能在该文件内被访问,不能被其它文件访问。2.Static与非static的区别 stati
重学C++Primer笔记9---回调函数与函数指针的应用
1 函数指针—指向函数的指针  函数指针是指向函数而非对象的指针。像其他指针一样,函数指针也指向某个特定的类型,函数类型由其返回类型以及形参表确定,而与函数名无关。例如:bool (*pf)(const string &,const string &);   将pf声明为指向函数的指针,带有两个const string&类型的形参和bool类型的返回值。 注意: *pf两侧的圆括号是必须的。 2
C++ Primer Plus第6版18个重点笔记
下面是我看《C++ Primer Plus》第6版这本书后所做的笔记,作为备忘录便于以后复习。笔记部分C++的const比C语言#define更好的原因?首先,它能够明确指定类型,有类型检查功能。其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。第三,可以将const用于更复杂的类型,比如数组和结构。C语言中也有const,其与C++中const的区别是:一是作用域规则不同;另一个是
《C++ Primer Plus(第六版)》(30)(第十四章 C++中的代码重用 编程题答案)
14.7 编程练习 1.Wine类有一个string类对象成员(参见第4章)和一个Pair对象(参见本章):其中前者用来存储葡萄酒的名称,而后者有2个valarry对象(参见本章),这两个valarry对象分别保存了葡萄酒的酿造年份和该年生产的瓶数。例如,Pair的第1个valarray对象可能为1988、1992和1996,第二个valarry 对象可能为24、48和144瓶。Wine最好有1
Cpp Primer--c++内置类型的默认初始化
Cpp Primer–c++内置类型的默认初始化标签(空格分隔): Cpp内置类型内置类型是编程语言自己定义的一些类型 在C++中内置类型有: 整型: ①整数 int、short和long ②字符型 char和wchar_t ③布尔型 bool 整型可用修饰:unsigned 浮点: float、double和long double 另外还定义了一种称为void的特殊类型。void
c primer plus第13章总结:文件输入/输出
标准 I\O:标准文件: - 标准输入:getchar()、gets()、scanf(); - 标准输出:putchar()、puts()、printf(); - 标准错误输出:提供一个可发送错误消息的逻辑上不同的位置; 二进制模式打开文件时:\r\n表示换行,ctrl+Z 表示结束; 文本模式打开文件时:\n表示换行;打开文件函数:fopen()函数:FILE * fp = fop
C Primer Plus (第六版)中文版 第十章 编程练习答案
C Primer Plus (第六版)中文版 第十章 编程练习答案
C++Primer第五版 7.5.1节练习
练习7.36:下面的初始值是错误的,请找出问题所在,并尝试修改它Struct X{ X(int i, int j) : base(i), rem(base%j){} Int rem,base; };答:发生未定义的错误,因为数据成员的顺序先是rem,再到base,因此rem(base%j)这句话,base在rem之后被初始化,因此发生未定义的错误。改法:rem(i%j)练习7.37:使用本节提供的S
《C++ Primer》读书笔记——第十三章_拷贝控制
一个类有5种特殊的成员函数:拷贝构造函数、拷贝赋值运算符、覅用构造函数、移动赋值运算符、析构函数。如果没有定义这些拷贝控制成员,编译器会自动为它定义缺失的操作。 13.1  拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 class Foo { public: Foo(); Foo(const F
C/C++内存分布与变量初始化顺序
关于入栈、出栈,栈顶栈底之类的分析见 函数调用的压栈出栈过程分析 下面继续分析C/C++的内存分布。 虽然0x10比一个变量需要的4个地址大了一些,但是0x10应该是规定的最小单位了。假如你要用的空间刚好是它的整数倍,其实是不浪费一分钱栈空间的,下边做一个数组,证明栈空间大小刚好是所有非静态变量占用空间的大小。 这里可以先无视hello的声明,它不在栈空间,后面会分析。