Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将对'std::cout'的引用存储为类成员_C++_Cout - Fatal编程技术网

C++ 如何将对'std::cout'的引用存储为类成员

C++ 如何将对'std::cout'的引用存储为类成员,c++,cout,C++,Cout,我使用的是这样一个类: Output() << "Hello.\n"; copy(some_string_set.begin(), some_string_set.end(), ostream_iterator<string>(Output::m_stream, ", ")); 或者类似的事情(在修复静态数据成员之前,我无法修复底线) 我甚至尝试了auto,但GCC抛出了一个 错误:“std::cout”不能出现在常量表达式中 在我身上。我如何做我想做的?(重点是不必

我使用的是这样一个类:

Output() << "Hello.\n";
copy(some_string_set.begin(), some_string_set.end(), ostream_iterator<string>(Output::m_stream, ", "));
或者类似的事情(在修复静态数据成员之前,我无法修复底线)

我甚至尝试了
auto
,但GCC抛出了一个

错误:“std::cout”不能出现在常量表达式中


在我身上。我如何做我想做的?(重点是不必在我的代码中使用
std::cout
,而是让所有的输出都通过output类)

你应该存储一个
std::ostream&
结构输出
struct Output
{
    static ostream& stream;
};

ostream& Output::stream = cout;

int main()
{
    Output::stream << "hey";
}
{ 静态ostream&stream; }; ostream&Output::stream=cout; int main() {
输出::流将其存储为
std::ostream*


有时人们将引用存储为成员。这很容易出错,因为引用无法重新分配,这会导致赋值运算符执行错误操作。

为什么希望它是
静态的
?输出的类型是什么::m_stream?因为我的
输出
类将不断创建临时对象(每次使用第一行代码时),我不想每次都初始化它,再加上第二行代码需要一个静态成员的事实。@Harper:这是问题的一部分
:s
对我来说,这似乎不是一个非常干净的设计……为什么不使用对象的全局实例呢(正如
cout
cin
,…都是全球性的)?顺便说一句,类型应该是
std::ostream&
。True:但问题的另一面是指针可以为NULL。您可以通过使用boost引用对象绕过不可重新分配的引用。在我看来,在您没有选择(您需要重新分配)之前,始终更喜欢引用。另请注意:赋值运算符不会做错误的事情(它们将导致编译器错误)。这就是你想要的。在这种情况下,编译器有时会发出嘎嘎声。但是,OP要求的是一个不会被复制的静态引用。是的。重点是包装而不是原始引用。这就像使用一个智能指针,普通指针就够了。这种态度会导致膨胀软件。只要已经使用Java,lol.@rubenvb:。这就是ref的方式这是一种引用,它总是指向同一个对象。它们之所以用C++来解释这个问题的原因并不清楚,但是其中一个原因是引用被当作语法来处理它所引用的对象,因此,一种语法,如<代码> fo&eff=Obj.Fiff=AONEOBOR.<代码>应该调用< <代码>运算符=()。斯特凡:“他们用C++的方式解释C++的原因并不清楚”。-我不认为有那么多不清楚的地方。这是因为引用被认为是对象的替代名称,变量名就是对象的名称。如果我使用
int I=23;
,那么让
I
引用不同对象的唯一方法就是在较小的范围内对其进行阴影处理,当然我可以更改ob的值一个变量的名称是一样的,一个变量名的情况也是如此。也许不清楚为什么他们被称为“引用”,ISTR StruouStrup认为调用它们是“别名”……在最初的概念之后,C++引用可能会与C++指针或java中的指针类似。(啊,对不起,是Java中的引用)是巧合。@Steve Jessop:references实际上并不是一个对象的替代名称。正如你从Stroustrup引用中看到的,他本来会使用指针的,但它们在语法上是不合适的,所以他基本上创建了一个“新类型的指针”,只是使用了不同的语法。所以这种相似性不是巧合。顺便说一句,我很高兴我找到了那句话,因为在最后,他实际上给出了引用不可重置的理由。@Stefan:很有趣,所以“引用是替代名称”是对语义的事后合理化,引用需要有其他原因。谢谢!