相关疑难解决方法(0)

为什么非const引用不能绑定到临时对象?

为什么不允许对一个临时对象进行非const引用,哪个函数getx()返回?显然,这是C++标准禁止的,但我对这种限制的目的感兴趣,而不是对标准的引用.

struct X
{
    X& ref() { return *this; }
};

X getx() { return X();}

void g(X & x) {}    

int f()
{
    const X& x = getx(); // OK
    X& x = getx(); // error
    X& x = getx().ref(); // OK
    g(getx()); //error
    g(getx().ref()); //OK
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 很明显,对象的生命周期不是原因,因为C++标准不禁止对对象的持续引用.
  2. 很明显,上面的示例中的临时对象不是常量,因为允许调用非常量函数.例如,ref()可以修改临时对象.
  3. 此外,ref()允许您欺骗编译器并获取此临时对象的链接,这解决了我们的问题.

此外:

他们说"为const引用分配一个临时对象可以延长这个对象的生命周期","但是对于非const引用却没有任何说法".我的其他问题.以下赋值是否延长了临时对象的生命周期?

X& x = getx().ref(); // OK
Run Code Online (Sandbox Code Playgroud)

c++ const reference temporary c++-faq

221
推荐指数
6
解决办法
9万
查看次数

"回滚"或撤消任何适用于流的操纵器,而不知道机器人是什么

如果我将任意数量的操纵器应用于流,是否有办法以通用方式撤消这些操纵器的应用程序?

例如,请考虑以下事项:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << "Hello" << hex << 42 << "\n";
    // now i want to "roll-back" cout to whatever state it was in
    // before the code above, *without* having to know 
    // what modifiers I added to it

    // ... MAGIC HAPPENS! ...

    cout << "This should not be in hex: " << 42 << "\n";
}
Run Code Online (Sandbox Code Playgroud)

假设我想添加代码MAGIC HAPPENS,将流操纵器的状态恢复到我之前的状态cout << hex.我不知道我添加了什么操纵器.我怎么能做到这一点?

换句话说,我希望能够写出这样的东西(psudocode/fantasy …

c++

35
推荐指数
5
解决办法
9588
查看次数

在C++输出流中设置宽度

我试图通过设置不同字段的宽度在C++上创建一个整齐格式的表.我可以使用setw(n),做类似的事情

cout << setw(10) << x << setw(10) << y << endl;
Run Code Online (Sandbox Code Playgroud)

或更改ios_base :: width

cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
Run Code Online (Sandbox Code Playgroud)

问题是,这两种选择都不允许我设置默认的最小宽度,每次我都要向流写入内容时我必须更改它.

有没有人知道我可以做到这一点而无需无数次重复同一次呼叫?提前致谢.

c++ width

18
推荐指数
1
解决办法
3万
查看次数

与setw()有什么关系?

我最近被这样的事实所困扰:ios_base::width和/或setw操纵器必须在写入流的每个项目时重置.

也就是说,你必须这样做:

while(whatever)
{
    mystream << std::setw(2) << myval;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}
Run Code Online (Sandbox Code Playgroud)

好的.

但有谁知道为什么做出这个设计决定?是否有一些我缺失的理由,或者这只是标准的一个黑暗角落?

其他流格式修饰符(如链接的SO问题中所述)是"粘性",而setw不是.

c++ setw c++-standard-library

16
推荐指数
2
解决办法
4357
查看次数

在cout中与`fixed`相反的是什么?

使用时cout,<iomanip>标题中定义的默认格式化程序是什么?换句话说,一旦我将格式化程序设置为fixed使用cout << fixed << setPrecision(2),我该如何更改它?或者,我将它改回来的什么?

c++ cout formatter iomanip

10
推荐指数
2
解决办法
8286
查看次数

iomanip与一个类的对象

在C++程序中,我有一些代码来打印一个名为fraction的类的对象.它的变量是n(分子​​),d(分母)和sinal(信号:当分数为正时为真,否则为假).

ostream &operator << (ostream &os, const fraction &x){//n=0

    if(!x.sinal)
        os << "-";

    os << x.n;

    if(x.d!=1 && x.n!=0)
        os << "/" << x.d;

    return os;
}
Run Code Online (Sandbox Code Playgroud)

它做得很好,但当我尝试在其中使用setw()时,它无法正常工作:它只影响要打印的第一个项目(无论是信号还是分子).

我试图改变它,我找到的解决方案是首先将其转换为字符串,然后使用带有iomanip的操作系统:

ostream &operator << (ostream &os, const fraction &x){//n=0

    string xd, xn;

    stringstream ssn;
    ssn << x.n;
    ssn >> xn;

    stringstream ssd;
    ssd << x.d;
    ssd >> xd;

    string sfra = "";

    if(!x.sinal)
        sfra += "-";

    sfra += xn;

    if(x.d !=1 && x.n != 0){
        sfra += "/";
        sfra += xd;
    } …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
1
解决办法
165
查看次数

C++如何正确地证明多个数据

所以我必须发送到std::cout一列数据,我必须在数据周围显示一些字符,如:

    Plot Points
   (0,0), (2,3) 
(1,10), (12,14)
Run Code Online (Sandbox Code Playgroud)

我必须在列标题中的字母"s"输入下右对齐最后右括号"Points".

我把数据输出如下:

cout << right << setw(12) << "(" << x1 << "," << y1 << "), (" << x2 << "," << y2 << ")";
Run Code Online (Sandbox Code Playgroud)

但是我看到的所有例子似乎都表明正确而且setw似乎只影响我发送给的下一条数据cout,因此在这种情况下"("只有.

有没有办法将所有这些字符和变量组合在一起,以便在输出列中将它们全部合理化?

我只是在学习C++,所以期待有一些我还没有学到的简单解决方案吗?

c++ justify

6
推荐指数
2
解决办法
682
查看次数

如何允许setw适用于以下所有标准输出?

应该是一个微不足道的问题,但发现setw仅适用于其紧接着的输出,并且不确定如何允许它应用于以下所有输出.

例如,对于以下代码行

cout<<setw(3)<<setfill('0')<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)

要么

cout.width(3);
cout.fill('0');
cout<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)

我希望输出008 009代替008 9

c++

5
推荐指数
1
解决办法
1776
查看次数

如何使我的函数粘滞为重载的iostream提取操作符

我正在做一个学校项目,我需要经常更改文本颜色.项目目标是目前仅适用于Windows的控制台应用.将代码块与MinGW一起使用进行调试.我不是菜鸟,但是中级.

所以在代码中无处不在使用它是丑陋的:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), __col._colour_code);
Run Code Online (Sandbox Code Playgroud)

即使我把它包装在一个函数中,它仍然很麻烦和丑陋,因为你不能继续你的cout链.你必须打破链条,因为你必须SetColour在一个新的声明中调用,例如:

SetColour(GRAY);   cout << setcol(PURPLE) << " ID:[";
SetColour(AQUA);   cout << song.GetID();
SetColour(GRAY);   cout << "]" << " ";
SetColour(GREEN);  cout << song.GetTitle();
SetColour(WHITE);  cout << " by ";
SetColour(BRIGHT); cout << song.GetArtist() << "\n";
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的功能setw,setprecision等于是我打开了iomainp.h,并找了一些提示:

struct _Setw { int _M_n; };

inline _Setw 
setw(int __n)
{ return { __n }; }

template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>& 
operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
{
  __is.width(__f._M_n);
  return __is; …
Run Code Online (Sandbox Code Playgroud)

c++ windows console iomanip

5
推荐指数
1
解决办法
246
查看次数

Isnt setprecision不应该改变存储在变量中的值吗?

我认为setprecision不会改变变量本身的值.此外,当您将setprecision附加到cout时,它只会粘贴一次.但是,当我运行代码来验证时,它不起作用.

请考虑以下代码段:

int main()
{
    double x = 9.87654321;
    cout << setprecision(3) << fixed << x <<endl;    //Returns 9.877 as it should
    cout << x << endl;                               //Returns truncated value 9.877 again though it shouldnt.

    return 0;
}   
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我们用cout << x << endl;线设置精度替换为7,那么它会显示正确的值.谁能解释一下这个现象吗?

c++

2
推荐指数
1
解决办法
1616
查看次数

将uint8_t转换为字符串的方法

我有这个:

uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};

如何将其转换为char或其他内容,以便可以阅读其内容?这是我用于使用AES加密数据的密钥。

感谢帮助。谢谢

c++

1
推荐指数
1
解决办法
2万
查看次数