使用流中的常量参数创建对象

时间:2015-10-15 08:53:27

标签: c++

让我们假设我有一个

的课程
#include <iostream>
using namespace std;

class Test{
    public:
        friend istream& operator >> (istream& input, Test& test){
            input >> test.dummy;
            return input;
        };
        friend ostream& operator << (ostream& output, Test& test){
            output << test.dummy << endl;
            return output;
        };
    private:
        const int dummy;
}

这不起作用,因为虚拟是恒定的。有没有办法从文件加载并重新创建一个参数是常量的对象?

4 个答案:

答案 0 :(得分:7)

&#34;我真的,真的需要这个&#34;方式

使用const_cast。通常您将它用于外部看起来像是常量的对象,但在内部它们确实需要不时地更新状态。至少可以说,使用它从流中读取有点令人困惑。

friend istream& operator >> (istream& input, Test& test){
    input >> const_cast<int&>(test.dummy);
    return input;
};

推荐方式

沟渠流操作员,使用工厂功能。

static Test fromStream(istream& input) {
    int dummy;
    input >> dummy;
    return Test(dummy);
}

最好的方式

Ditch const。相反,如果需要,将整个对象作为const传递。

答案 1 :(得分:2)

你不能。流是你读的东西,它们不是工厂或类似的东西。

但您有几种选择:

  • 从流中读取非var $percentageComplete = (($(window).scrollTop() / ($(document).height() + $(window).height())) * 100); ,然后使用它来初始化const对象

  • 您可以constdummy,将对象初始化为未读,然后阅读const;那么你只能在dummy之外传递给const&

答案 2 :(得分:2)

您宣布dummy const,因此在Test的生命周期内明显改变它会违反const的合同。

这是operator>>目前正在做的事情,编译器正在帮助你阻止你破坏合同。

operator>>实际执行Test初始化吗?

如果operator>>只应对Test进行初始化而不是覆盖,那么您应该将operator>>转换为工厂函数,如gwiazdorr&#39;&#39}所示;推荐方式&#34;。

另一方面,如果operator>>覆盖Test,那么您就违反const dummy dummy的合同,而且&# 39;太糟糕了。因此,const应为非dummy

const 真的需要dummy吗?

您可以通过Test的界面简单地强制<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Unknown</title> <link href="file:///var/mobile/Applications/E450E9B5-A298-4912-BF3F-FBDE9D655B34/Library/Caches/UnzippedEpub/812CDAD1-30BF-454D-A3AD-6C24E06DEED8/OEBPS/Styles/stylesheet.css" rel="stylesheet" type="text/css" /> <style type="text/css"> @page { margin-bottom: 5.000000pt; margin-top: 5.000000pt; } @font-face { font-family: "21bdaaa95f669f5452de0c164082dc84"; src: local(serif) } @font-face { font-family: "21bdaaa95f669f5452de0c164082dc84"; src: url(res:///Data/FONT/tt0003m_.ttf) } @font-face { font-family: "21bdaaa95f669f5452de0c164082dc84"; src: url(../Fonts/21bdaaa95f669f5452de0c164082dc84.ttf) } </style> </head> <body class="calibre"> <h1 class="title" id="calibre_pb_0">book title</h1> <div class="annotation"> author </div> </body> </html> 的不变性。虽然在这种情况下它仍然可以在里面类中变异,这可能是你想要避免的。

答案 3 :(得分:1)

定义Dummy类:

class Dummy {
public:
    Dummy() { value = 0; }
    friend istream& operator >> (istream& input, const Dummy& dummy){
        input >> dummy.value;
        return input;
    }
    friend ostream& operator << (ostream& output, const Dummy& dummy){
        output << dummy.value << endl;
        return output;
    }
    int getValue() const { return value; }
private:
    mutable int value;
};

并在Test

中使用它
class Test {
public:
    Test() { cin >> dummy; }
private:
    const Dummy dummy;
};

它按预期工作。