Проблема с const при перегрузке оператора
Вот кусок кода:
const String operator +(const String& s1,const String& s2) const;
}; //здесь кончается описание класса
const String String::operator +(const String& s1,const String& s2)const{}
На него выдаётся такая ошибка:
error: ‘const String String::operator+(const String&, const String&) const’ must take either zero or one argument
Мол оператор, член класса, может принимать только один аргумент. Убираем String::
const String operator +(const String& s1,const String& s2) const;
};
const String operator +(const String& s1,const String& s2)const{}
Выдаёт ошибку:
error: non-member function ‘const String operator+(const String&, const String&)’ cannot have cv-qualifier
Так как быть? И чтоб принимал два аргумента и чтоб константным был? Приём двух аргументов - чтобы можно было писать s = 'a' + s; т.е. когда определён конструктор от char и он стоит левым аргументом (оператор, принимающий один аргумент, может левым аргументом принимать только объект класса, а там у нас char - не работает, в общем, надо два аргумента) Константность, думаю, понятно для чего.
При всём при этом компилируется без проблем класс Matrix, где вроде всё так же написано, как и в классе String, который не компилится:
class Matrix
{
private:
double data[5][5];
public:
Matrix()
{
// Присваиваем всем элементам массива значение 0.0
for (int row=0; row < 5; ++row)
for (int col=0; col < 5; ++col)
data[row][col] = 0.0;
}
double& operator()(int row, int col);
const double& operator()(int row, int col) const; // для константных объектов
};
double& Matrix::operator()(int row, int col)
{
//assert(col >= 0 && col < 5);
//assert(row >= 0 && row < 5);
return data[row][col];
}
const double& Matrix::operator()(int row, int col) const
{
//assert(col >= 0 && col < 5);
//assert(row >= 0 && row < 5);
return data[row][col];
}
Вот мой класс полностью:
class String{
private:
char* str;
int size;
public:
static int COUNT;
static int DEF_LEN;
String(const char* text, const int size): size(size) {
++COUNT;
str = new char[size];
for (size_t i = 0; i < size; i++) {
str[i] = text[i];
}
}
String(const char ch){
}
~String(){
delete[] str;
--COUNT;
}
String(const String& s): size(s.size) {
++COUNT;
str = new char[size];
for (size_t i = 0; i < size; i++) {
str[i] = s.str[i];
}
}
static int const get_cnt() {return COUNT;}
int const get_size() {return size;}
void const print(){
for (size_t i = 0; i < size; ++i) {
cout << str[i];
}
cout << endl;
}
String& operator =(const String& s){
if (this == &s) {return *this;}
else{
delete[] str;
size = s.size;
str = new char[size];
for (size_t i = 0; i < size; ++i) {
str[i] = s.str[i];
}
return *this;
}
}
String& operator +=(const String& s){
char* tmp = new char[size + s.size];
for (size_t i = 0; i < size; ++i) {
tmp[i] = str[i];
}
for (size_t i = 0; i < s.size; ++i) {
tmp[size + i] = s.str[i];
}
delete[] str;
size += s.size;
str = tmp;
}
const String operator +(const String& s1,const String& s2) const;
};
int String::COUNT = 0;
int String::DEF_LEN = 250;
const String String::operator +(const String& s1,const String& s2)const{
String s = s1;
s+=s2;
return s;
}