Здравствуйте уважаемые форумчане!
| Код | // Класс одномерных массивов строк, каждая строка задается длиной и указателем на выделенную для нее память.
#include <new> #include <cstdlib> #include <cstring> #include <iostream> using namespace std;
void *operator new(size_t sz) { return operator new(sz,nothrow); } void *operator new[](size_t sz) { return operator new[](sz,nothrow); }
class sArray { private: char ** mPtr; unsigned int mSize; void Clear();
public: sArray(); sArray(unsigned int sizeArray); sArray(const sArray & sA); ~sArray();
sArray & operator = (const sArray &sA); friend sArray & operator + (const sArray &sA, const sArray &sB); const char * operator[](unsigned int i) const;
unsigned int getSize() const; unsigned int getStringLen(unsigned int i) const;
void set(const sArray & sA, bool f); bool setAt(unsigned int i, const char *str);
void output(); bool find(const char *f);
};
void sArray::Clear() { if(mSize && mPtr == NULL) { for(unsigned int i=0; i < mSize; i++) if(mPtr[i]) { delete [] mPtr[i]; mPtr[i]=NULL; } delete [] mPtr; mPtr = NULL; mSize = 0; } } sArray::sArray() { mPtr = NULL; mSize = 0; } sArray::sArray(unsigned int sizeArray) { mSize = sizeArray; mPtr = new char * [mSize]; if (mPtr == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); }
for(unsigned int i=0; i < mSize; i++) mPtr[i] = NULL; } sArray::sArray(const sArray & sA) { set(sA, 1); } sArray::~sArray() { Clear(); } sArray & sArray::operator = (const sArray &sA) { set(sA,1); } sArray & operator + (const sArray &sA,const sArray &sB) { unsigned int cnt = sA.getSize(); unsigned int k = cnt + sB.getSize();
sArray temp(k);
temp.set(sA,0);
for (unsigned int i=0; i < sB.getSize()-1; i++) { if (!temp.find(sB[i])) { cerr << cnt+i << " " << sB.getSize() << " " << k << endl; temp.setAt(cnt+i,sB[i]); cnt++; } }
return temp; } const char * sArray::operator[] (unsigned int i) const { if (i < mSize) return mPtr[i]; return "Ошибка! Выход за пределы массива!\n"; } unsigned int sArray::getSize() const { return mSize; } unsigned int sArray::getStringLen(unsigned int i) const { if(i < mSize) return strlen(mPtr[i]); cerr << "Error! " << i << " >= " << mSize << endl; abort(); } void sArray::set (const sArray &sA, bool f) { if (f) { Clear(); mSize = sA.getSize(); mPtr = new char *[mSize]; if (mPtr == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); } }
int sizeString; for(unsigned int i=0; i < sA.getSize(); i++) { sizeString = sA.getStringLen(i); if(sizeString>0) { mPtr[i]=new char[sizeString+1]; if (mPtr[i] == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); } strcpy(mPtr[i], sA[i]); } } } bool sArray::setAt(unsigned int i, const char *str) { if (i < mSize) { if (!this->find(str)) { if(mPtr[i]) delete [] mPtr[i]; mPtr[i] = new char [strlen(str)+1]; if (mPtr[i] == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); } strcpy(mPtr[i], str); return 1; } cerr << "Ошибка присваивания! Данная строка уже есть в массиве!\n"; return 0; } cerr << "Ошибка в присваивании! Выход за пределы массива!\n"; return 0; } void sArray::output() { if (mSize == 0) cerr << "Ошибка! Массив строк пуст!";
cerr << endl; for (unsigned int i=0; i < mSize; i++) { cerr << mPtr[i]; } cerr << endl; } bool sArray::find(const char* f) { int k = 0; for (unsigned int i=0; i < mSize; i++) { k = strcoll(f, mPtr[i]); if ( k == 0 ) return 1; } return 0; }
int main() { sArray sa(2); sa.setAt(0,"Hello, "); sa.setAt(1,"World!");
sArray ka(3), kb; ka.setAt(0,"\nHi "); ka.setAt(1,"my "); ka.setAt(2,"world!"); kb = sa + ka; kb.output();
return 0; }
|
Собственно две проблемы: 1) Как правильно реализовать перегрузку + (создаю sArray и возвращаю указатель на локальную переменную sArray temp) ?
| Код | sArray & operator + (const sArray &sA,const sArray &sB) { unsigned int cnt = sA.getSize(); unsigned int k = cnt + sB.getSize(); sArray temp(k); temp.set(sA,0); for (unsigned int i=0; i < sB.getSize()-1; i++) { if (!temp.find(sB[i])) { cerr << cnt+i << " " << sB.getSize() << " " << k << endl; temp.setAt(cnt+i,sB[i]); cnt++; } } return temp; }
|
2) Почему вылетает прога на сравнении strcoll метода find!?
| Код | bool sArray::find(const char* f) { int k = 0; for (unsigned int i=0; i < mSize; i++) { k = strcoll(f, mPtr[i]); if ( k == 0 ) return 1; } return 0; }
|
Заранее благодарен за ответ! |