2016-07-03 7 views
-3

Ich habe eine Klasse Screen, die Member-Inhalt mit std::string(size_t, char) Konstruktor initialisiert hat.Kann nicht verwenden String (Größe_t, Char) Konstruktor

#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, ' '); 
}; 

Ich habe versucht, eine Zeichenfolge in ähnlicher Weise im Inneren des Haupt erklärt, aber ich den gleichen Fehler, ich bin, um herauszufinden, nicht in der Lage, was ich falsch hier tue.

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

Warum verwenden Sie nicht einfach die Initialisierungsliste, um die 'std :: string' zu erstellen? Welchen Zweck dient es zu versuchen, zu initialisieren, wo Sie Ihre Zeichenkette hier deklariert haben? String content ((width * height), ''); '? – PaulMcKenzie

Antwort

2

Folgendes behebt Ihren Code. Ich denke, ein wenig Begriffsklärung zwischen einem Mitglied Funktionsdeklaration und eine Definition Mitgliedsdaten benötigt wurde:

std::string content = std::string(width * height, ' '); 

Aber was würde ich tun, anstatt mich in Konstrukteuren wiederholen, delegieren Konstruktor und ein Standardargument verwenden:

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; 
}; 

und du bist fertig.

1

Ich habe noch nie diese Syntax verwendet, aber es scheint, dass Sie std :: string innerhalb der Klasse Körper initialisieren kann wie folgt:

std::size_t width = 24; 
std::size_t height = 80; 
std::size_t cursor = 0; 
std::string content{std::string((width * height), ' ')}; 

Sie sollten wie oben Reihenfolge der Initialisierung zu halten erinnern.

Das Problem mit Ihrem Code ist, dass, wenn Sie content Initiator in der Liste der Konstruktoren initialisieren, der Compiler keine Initialisierung ausführen wird, die in Ihrer Variablendefinition ist. Sie können also - wie Sie in einem Kommentar gesagt haben - keine Standardinitialisierung durchführen und sie dann im Konstruktor überschreiben.

Verwandte Themen