我有一些代碼,我不得不寫一些代碼來代替幾千次的函數。這個函數的問題是返回一個指向靜態分配緩衝區的指針,這是一個荒謬的問題。我終於能夠證明間歇性的高負載錯誤是由不好的做法造成的。尋找一些重構建議
我正在更換的功能的簽名爲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