Java代码转C++代码,求懂两种语言的帮个忙

elemusic 2011-09-26 08:56:08
改了半天改晕了.....好像Java的substring用法同C++不同,具体怎么变没搞清.....似乎Java的substring对空元素访问有些自动纠错处同C++不同吧。

要转的代码是这页前面的这一小段

http://www.oodesign.com/interpreter-pattern.html

这是我目前转的,但是不对的,哪位能帮着改一下使程序正常,达到罗马数字转阿拉伯数字的功能。或者说说Java那里怎么处理,C++中怎么等价变换过去也好。


#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Context
{
public:
string input;
int output;
Context(string str_){input=str_;}
string GetInput()
{
return input;
}
void SetInput(string input_)
{
input = input_;
}
int GetOutput()
{
return output;
}
void SetOutput(int output_)
{
output = output_;
}
};

class Expression
{
public:
Expression(){}
void interpret(Context* context)
{
if (context->GetInput().length() == 0)
return;


if (context->GetInput().find(nine()))
{
context->SetOutput(context->GetOutput() + (9 * multiplier()));
context->SetInput(context->GetInput().substr(2, len-2));//自己跟了一下,错误出在这里
//input长度为1时会有问题,其实我想可能还是不太对吧,主要不太清楚Java那个substring到底怎么处理的
}
else if (context->GetInput().find(five()))
{
context->SetOutput(context->GetOutput() + (5 * multiplier()));
context->SetInput( context->GetInput().substr(1, len-1));
}
else if (context->GetInput().find(four()))
{
context->SetOutput(context->GetOutput() + (4 * multiplier()));
context->SetInput(context->GetInput().substr(2, len-2));
}

while (context->GetInput().find(one()))
{
context->SetOutput(context->GetOutput() + (1 * multiplier()));
string tempstr = context->GetInput().substr(1, len-1);
if(tempstr != "")
{
context->SetInput(context->GetInput().substr(1, len-1));
}
else
{
break;
}

}
}
virtual string one() = 0;
virtual string four() = 0;
virtual string five() = 0;
virtual string nine() = 0;
virtual int multiplier() = 0;
};

class ThousandExpression : public Expression
{
public:
ThousandExpression(){}
string one(){return "M";}
string four(){return " ";}
string five(){return " ";}
string nine(){return " ";}
int multiplier(){return 1000;}
};

class HundredExpression : public Expression
{
public:
HundredExpression(){}
string one(){return "C";}
string four(){return "CD";}
string five(){return "D";}
string nine(){return "CM";}
int multiplier(){return 100;}
};

class TenExpression : public Expression
{
public:
TenExpression(){}
string one(){return "X";}
string four(){return "XL";}
string five(){return "L";}
string nine(){return "XC";}
int multiplier(){return 10;}
};

class OneExpression : public Expression
{
public:
OneExpression(){}
string one(){return "I";}
string four(){return "IV";}
string five(){return "V";}
string nine(){return "IX";}
int multiplier(){return 1;}
};

int main()
{
// 罗马数字转阿拉伯数字
string roman = "MCMXXVIII";

Context* con = new Context(roman);

vector<Expression*> vec;

vec.push_back(new ThousandExpression());
vec.push_back(new HundredExpression());
vec.push_back(new TenExpression());
vec.push_back(new OneExpression());

vector<Expression*>::iterator pos;

for(pos = vec.begin(); pos != vec.end(); ++pos)
{
(*pos)->interpret(con);
}

delete con;



return 0;
}



...全文
75 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
elemusic 2011-09-27
  • 打赏
  • 举报
回复
我想问的是


context.setInput(context.getInput().substring(2));

对于input长度小于2的情况这句是怎么正常处理的,C++怎么转换,看起来好像Java对空元素直接访问有什么特别的处理?
WorldCreater 2011-09-26
  • 打赏
  • 举报
回复
substring


public String substring(int beginIndex)

public String substring(int beginIndex,
int endIndex)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧