2013-09-05 12 views
0

这里是我的功能运输及工务局局长返回一个ostream

ostream margain(std::string firstWord) 
{ 
    ostream x; 
    x << std::setw(20) << firstWord; 
    return x; 
} 

主我想使用的功能如下

std::cout<< margain("start") << "````````````````````````````````````" << std::endl; 
// print things out 
//then 
std::cout<< margain("End") << "````````````````````````````````````" << std::endl; 

我得到的输出,启动或没有显示结束和返回值是

0````````````````````````````````````

我该如何解决它?为什么?

编辑: 我知道的功能是什么引起,因为如果我添加此

COUT < <的std ::运输及工务局局长(20)< < firstWord; 在功能上,它打印正确,

我固定它,不是最好的方式,但作为

调用功能

马加(标准::法院, “结束” )< < “〜= = = = = = = = = = = = = = = = = = = = = = = = = =〜=“< < endl;

功能看起来像

ostream& margain(ostream& stream, std::string firstWord) 
{ 
    stream << std::left << std::setw(10) << firstWord; 
    return stream; 
} 

谁知道更好的办法?

+0

当你在x声明margain,当你这样做时,是否有编译器错误?就像我这样做的时候,我被告知'std :: basic_ostream <_Elem,_Traits>'错误,因为没有合适的默认构造函数可用。 – DarkHorse

回答

2

您正在打印ostream的值,而不是值firstword。在这种情况下,ostream x是一个未打开的流,所以它不会“做”任何事情。由于编译器允许转换为bool(C++ 11)或void *(C++ 11之前),因此将打印该转换的“值”。请注意,x上的任何操作都不会影响cout

最简单的解决方案,我认为是实际添加std::setw(20)到您的输出线:

std::cout<< std::setw(20 << "End" << "````````````````````````````````````" << std::endl; 

另一种选择将是通过std::coutmargain,并返回std::string,是这样的:

std::string margain(ostream& x, const std::string& firstWord) 
{ 
    x << std::setw(20); 
    return firstWord; 
} 

那么你可以做:

std::cout<< margain(cout, "start") << "````````````````````````````````````" << std::endl; 

但它不完全灵活或“整洁”。

第三个选项当然是有一个MarginString类:

class MarignString 
{ 
    private: 
    int margin; 
    std::string str; 
    public: 
    MarginString(int margin, std::string str) margin(margin), str(str) {} 
    operator std::string() { return str; } 
    friend std::ostream& operator(std::ostream& os, const MarginString& ms); 
}; 


std::ostream& operator(std::ostream& os, const MarginString& ms) 
{ 
    os << std::setw(ms.margin) << ms.str; 
    return os; 
} 

... 
std::cout<< MarginString(20, "start") << "````````````````````````````````````" << std::endl; 

注意,这最后的方法可能不是很大要么...;)

1
struct margin 
{ 
    margin(std::string word) : word(word) { } 

    friend std::ostream& operator <<(std::ostream& os, margin const& m) 
    { 
     return os << std::setw(20) << m.word; 
    } 

private: 
    std::string word; 
}; 
+0

我认为'operator <<'函数需要超出'struct'(或者是一个非朋友但静态函数) –

+0

为什么?这段代码会按原样编译... – 0x499602D2

+0

它可能编译得很好,但是'operator <<'的第一个参数应该是'ostream',在你的情况下,它会是'this',对吧?或者,在函数的前面粘贴'friend'对static有类似的作用,它不再是一个成员函数? –

相关问题