मैं, मेरे सामने इतने सारे प्रोग्रामर की तरह, अपने बालों को दाएं-ऑफ-मार्ग-मैट्रिक्स-क्लास-इन-सी ++ लिखने से बाहर निकाल रहा हूं। मैंने कभी भी गंभीर ऑपरेटर ओवरलोडिंग नहीं की है और इससे समस्याएं पैदा हो रही हैं। अनिवार्य रूप से,मैं चेनिंग की अनुमति देने के लिए सी ++ ऑपरेटरों को ओवरलोड करने के बारे में कैसे जा सकता हूं?
के माध्यम से कदम उठाकर मैं समस्याओं का कारण बनता हूं।
cMatrix Kev = CT::cMatrix::GetUnitMatrix(4, true);
Kev *= 4.0f;
cMatrix Baz = Kev;
Kev = Kev+Baz; //HERE!
क्या डिबगर के अनुसार हो रहा हो लगता है कि कीव और बाज जोड़ रहे हैं, लेकिन फिर मूल्य खो दिया है और जब यह कीव को फिर नियत की बात आती है, स्मृति बस उसके डिफ़ॉल्ट कुशल मूल्यों है। इस कथन की अनुमति देने के लिए मैं अपने ऑपरेटरों को कैसे अधिभारित कर सकता हूं? मेरा (छीन लिया गया) कोड नीचे है।
//header
class cMatrix
{
private:
float* _internal;
UInt32 _r;
UInt32 _c;
bool _zeroindexed;
//fast, assumes zero index, no safety checks
float cMatrix::_getelement(UInt32 r, UInt32 c)
{
return _internal[(r*this->_c)+c];
}
void cMatrix::_setelement(UInt32 r, UInt32 c, float Value)
{
_internal[(r*this->_c)+c] = Value;
}
public:
cMatrix(UInt32 r, UInt32 c, bool IsZeroIndexed);
cMatrix(cMatrix& m);
~cMatrix(void);
//operators
cMatrix& operator + (cMatrix m);
cMatrix& operator += (cMatrix m);
cMatrix& operator = (const cMatrix &m);
};
//stripped source file
cMatrix::cMatrix(cMatrix& m)
{
_r = m._r;
_c = m._c;
_zeroindexed = m._zeroindexed;
_internal = new float[_r*_c];
UInt32 size = GetElementCount();
for (UInt32 i = 0; i < size; i++)
{
_internal[i] = m._internal[i];
}
}
cMatrix::~cMatrix(void)
{
delete[] _internal;
}
cMatrix& cMatrix::operator+(cMatrix m)
{
return cMatrix(*this) += m;
}
cMatrix& cMatrix::operator*(float f)
{
return cMatrix(*this) *= f;
}
cMatrix& cMatrix::operator*=(float f)
{
UInt32 size = GetElementCount();
for (UInt32 i = 0; i < size; i++)
{
_internal[i] *= f;
}
return *this;
}
cMatrix& cMatrix::operator+=(cMatrix m)
{
if (_c != m._c || _r != m._r)
{
throw new cCTException("Cannot add two matrix classes of different sizes.");
}
if (!(_zeroindexed && m._zeroindexed))
{
throw new cCTException("Zero-Indexed mismatch.");
}
for (UInt32 row = 0; row < _r; row++)
{
for (UInt32 column = 0; column < _c; column++)
{
float Current = _getelement(row, column) + m._getelement(row, column);
_setelement(row, column, Current);
}
}
return *this;
}
cMatrix& cMatrix::operator=(const cMatrix &m)
{
if (this != &m)
{
_r = m._r;
_c = m._c;
_zeroindexed = m._zeroindexed;
delete[] _internal;
_internal = new float[_r*_c];
UInt32 size = GetElementCount();
for (UInt32 i = 0; i < size; i++)
{
_internal[i] = m._internal[i];
}
}
return *this;
}
मेरा उद्देश्य यह चरण सी ++ एसडीडी लिब के साथ रहना है और यदि संभव हो तो किसी भी अन्य libs को जोड़ने से बचें। बूस्ट आसान है लेकिन एक जानवर भी थोड़ा सा है! – User2400
मैं 'ऑपरेटर +' को गैर-सदस्य के रूप में लागू करना चाहता हूं। अन्य फायदों के अलावा, यह भी एक सी ++ 11 कंपाइलर को एक रावल्यू लीफ की प्रति को अनुकूलित करने की अनुमति देता है टी तर्क अगर आप इसे प्रति मान पास करते हैं। (मेरा जवाब देखें।) – sbi
@fneep: मैं समझता हूं कि आपको अभी भी बूस्ट.ऑपरेटर को ऑपरेटरों को लागू करने के लिए वैचारिक तरीके को समझने के लिए एक नज़र रखना चाहिए। – Sebastian