我有一些代码,我不得不写一些代码来代替几千次的函数。这个函数的问题是返回一个指向静态分配缓冲区的指针,这是一个荒谬的问题。我终于能够证明间歇性的高负载错误是由不好的做法造成的。寻找一些重构建议
我正在更换的功能的签名为char * paddandtruncate(char *,int)
,char * paddandtruncate(float,int)
或char * paddandtruncat(int,int)
。每个函数都返回一个指向静态分配的缓冲区的指针,该缓冲区在后续调用时被覆盖
我有三个常量之一
- 代码必须是可更换的与主叫方没有任何影响。
- 很少有时间来解决这个问题。
- 可接受的性能。
我想要一些风格和可能的重构想法的意见。
该系统基于用空格填充的固定宽度字段,并且具有一些架构问题。由于该项目的规模大约为1,000,000行,因此这些地址无法解决。
我最初计划在创建后允许更改数据,但认为不可变对象提供了更安全的解决方案。
using namespace std;
class SYSTEM_DECLSPEC CoreString
{
private:
friend ostream & operator<<(ostream &os,CoreString &cs);
stringstream m_SS ;
float m_FltData ;
long m_lngData ;
long m_Width ;
string m_strData ;
string m_FormatedData;
bool m_Formated ;
stringstream SS ;
public:
CoreString(const string &InStr,long Width):
m_Formated(false),
m_Width(Width),
m_strData(InStr)
{
long OldFlags = SS.flags();
SS.fill(' ');
SS.width(Width);
SS.flags(ios::left);
SS<<InStr;
m_FormatedData = SS.str();
}
CoreString(long longData , long Width):
m_Formated(false),
m_Width(Width),
m_lngData(longData)
{
long OldFlags = SS.flags();
SS.fill('0');
SS.precision(0);
SS.width(Width);
SS.flags(ios::right);
SS<<longData;
m_FormatedData = SS.str();
}
CoreString(float FltData, long width,long lPerprecision):
m_Formated(false),
m_Width(width),
m_FltData(FltData)
{
long OldFlags = SS.flags();
SS.fill('0');
SS.precision(lPerprecision);
SS.width(width);
SS.flags(ios::right);
SS<<FltData;
m_FormatedData = SS.str();
}
CoreString(const string &InStr):
m_Formated(false),
m_strData(InStr)
{
long OldFlags = SS.flags();
SS.fill(' ');
SS.width(32);
SS.flags(ios::left);
SS<<InStr;
m_FormatedData = SS.str();
}
public:
operator const char *() {return m_FormatedData.c_str();}
operator const string&() const {return m_FormatedData;}
const string& str() const ;
};
const string& CoreString::str() const
{
return m_FormatedData;
}
ostream & operator<<(ostream &os,CoreString &cs)
{
os<< cs.m_Formated;
return os;
}
对不起,有什么问题吗?你已经张贴你做了什么,以及大量的代码,但没有实际的问题 – 2009-11-25 17:28:45
我想,如果给任何人能够想到一个更好的解决方案的限制,我想知道。 – rerun 2009-11-25 18:12:06