阅读:2492回复:0
新的起点控制权的改变来得非常突然。
吉尔伯一直在监视舞厅的大门,我们已经听到几阵撞门声。他们通过两边的大门攻了过来,当我们被俘时大部分还在睡梦中。
我被巨大的重击声和在两个相对的大门之间移动的强烈灯光所惊醒。很明显,敌人想进行突然袭击。吉尔伯的命令再清楚不过了-遇到攻击的时候,抓上我们的行李和外星文物,跳入森林大门,这也正是我们想做的。
Glib和他的几个官员就是这样做的,他们迅速地到另一个世界里并从我们的视线中消失吉尔伯和几个官员跳了进去,旋即消失于我们的视野当中。当大门卷起、全副武装的战士高喊“不许动”,从两边向我们冲过来时,我们中的大部分人正拼命地奔向金属球门。我在珍妮前面,靠近大门,正犹豫不决着....这时敌人的子弹飞了过来,我赶快跳了进去。
当我穿过那扇大门时,我没有感觉到什么不寻常,但是我衣服外面的温度计显示温度已跃升到了28°C。我向后快速地扫视了一下-珍妮仍然在舞厅里,包裹扔到地上,双手高举着。我没有等着继续看她怎么被捕俘,赶紧跟随着Glib的随行人员,匆忙地走进了新世界的丛林中。
- - - - - - - - - - - - - - - - - - - - - - - - -
管理上的变化来得很突然。
由于我们公司和我们的买主都不是上市交易的,董事会能够悄悄地谈交易,而且对员工也保密,这种状况一直持续到实际合并日的前几周。因此在新年后不久我们第一次听到了“合并”的声明(用这个词来代替“收购”或“出售”显得体面一些,因为我们公司无论规模和状况均不如我们的买主)而且在两个星期内我们发现自己已经替新的老板工作了。
彼得.威廉姆斯给人的第一印象像是个通情达理的人,尽管作为一个技术队伍的管理者他有点沉迷于体育。随着时间的过去,我有更多的机会来完善对他的看法,而且在他手下工作我也获得了经验。我非常赞同彼得的第一把火,或者说是没什么动作:他保留了我们整个队伍,而且不来干预我们的工作。大家对这个安排非常满意,除了鲍勃,他以为自已这次能获得提升。
一些紧急任务使我从低优先级的内部建库工作中脱离出来(不是说内部库不重要而是说指派给我的每一个任务都不重要,因为我刚刚开始做)。等我再次有喘息的机会时,我回到了刚写一半的库代码。我做的部分只需满足两个需求:需求247要求是“一个叫做ConvertBase的函数,它带有一个string参数,表示一个以N为基数的数字string参数,功能是将它转换为一个string,这个string 表示以M为基数的相同的数字”。Guru告诉我需求314是“一种从文本流中读和写任意基数的数字的方法”。在这样的指导下,我希望可以用后者来实现前者而避免多余的工作,我写了如下的代码:
string ConvertBase( size_t base1, size_t base2,
const string& src )
{
stringstream s1( src );
long value;
if( !( s1 >> Num( base1, value )).eof() ||
!( s1 >> std::ws ).eof() )
throw logic_error( "src is not a valid number" );
stringstream s2;
if( !( s2 << Num( base2, value ) ) )
throw logic_error( "unexpected error emitting "
"converted number" );
return s2.str();
}
这似乎是用来实现需求247的,虽然它要依赖于需求314的Num,而且要等我完成了Num 这才能起作用。迄今为止,我只有一个简单的测试例,用一个接到一个Num桩模块来通过编译,并且当我考虑它时,我加了一个检查条件把基数限制在一个合理的范围内。
class Num
{
public:
Num( size_t base, long& value )
: base_(base), value_(value)
{
if( base < 1 || base > 36 )
throw logic_error( "base must be from "
"1 to 36" );
}
size_t Base() const { return base_; }
long& Value() { return value_; }
long Value() const { return value_; }
private:
size_t base_;
long& value_;
};
istream& operator>>( istream& i, Num& n )
{
string s;
i >> s;
n.Value() = 255; // todo: really convert input
// to n's base_
return i;
}
ostream& operator<<( ostream& o, const Num& /* n */ )
{
return o << "FF"; // todo: really output
//n.value_ in n.base_
}
int main()
{
string result = ConvertBase( 10, 16, "255" );
cout << result << endl;
return result == "FF" ? 0 : 1;
}
接下来,我知道我必须通过为Num s真正实现<<和>>来完成314。在我准备开始编码时,我发现在已有的操作符<<和>>上有一个严重的缺陷。我的身体向屏幕靠近,正准备开始修改时,“啪”的一声,一本书合拢的声音向我提示Guru的存在。
"鲍勃在附近吗?"我低声问道。
“不在,我们尽管说吧”,她说着并在我的客椅上座了下来。她用手指着屏幕,继续说:“到底是什么使你着魔似地做那件事?”
“是的,我知道,我正在研究。我已经好几个星期没有碰它们了,而现在最明显不过的事情摆在了我面前。”
“哈,那么自个想办法。”
我指着<<和>>这两个讨厌的操作符:“我有意无意地简单实现它们,只用于基本的char以及char_traits ![]() |
|
|