让我们假设我有一个
的课程#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;
}
这不起作用,因为虚拟是恒定的。有没有办法从文件加载并重新创建一个参数是常量的对象?
答案 0 :(得分:7)
使用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
对象
您可以const
非dummy
,将对象初始化为未读,然后阅读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;
};
它按预期工作。