C ++ операторы перегрузки, конструкторы и многое другое

Я создал свои четыре метода для обработки строк как чисел:

std::string addStrings(std::string,std::string);
std::string subtractStrings(std::string,std::string);
std::string multiplyStrings(std::string,std::string);
std::string divideStrings(std::string,std::string);

Затем я решил создать класс больших чисел (называемый bin). Я новичок в копировании конструкторов и операторов присваивания, поэтому мне нужна ваша помощь, чтобы исправить мой код:

class bin{
private:
std::string value;
public:
bin(){}
bin(const char* v1){
value = v1;
}
bin(std::string v1){
value = v1;
}
bin(const bin& other){
value = other.value;
}
bin& operator=(const bin& other){
value = other.value;
return *this;
}
bin& operator=(const char* v1){
value = v1;
return *this;
}
std::string getValue() const{
return value;
}
friend std::ostream& operator<<(std::ostream&,bin&);
};

std::ostream& operator<<(std::ostream& out,bin& v){
out << v.value;
return out;
}
bin operator+(bin& value1,bin& value2){
return bin(addStrings(value1.getValue(),value2.getValue()));
}
bin operator-(bin& value1,bin& value2){
return bin(subtractStrings(value1.getValue(),value2.getValue()));
}
bin operator*(bin& value1,bin& value2){
return bin(multiplyStrings(value1.getValue(),value2.getValue()));
}
bin operator/(bin& value1,bin& value2){
return bin(divideStrings(value1.getValue(),value2.getValue()));
}

Почему это работает:

bin d = a/c;
std::cout << d << std::endl;

и это не так:

станд :: соиЬ << а / с;

(a и c были объявлены ранее). Также не работает цепочка операторов, например:

bin d = a * b + d;

броски:

no match for operator* (operands are bin and bin).

Спасибо!

1

Решение

Внутри этих операторов:

operator<<
operator+
operator-
operator*
operator/

Ты должен взять const bin& вместо bin&, В противном случае ваши функции не смогут принять временный параметр.

И когда вы объединяете операторы, значения, возвращаемые каждым независимым оператором, являются временными.

3

Другие решения

Во-первых, так как ваш класс имеет только std::string член, вам не нужно реализовывать конструктор копирования или оператор присваивания, так как компилятор по умолчанию при условии, что они будут работать просто отлично для вас.

Во-вторых, все вы, операторы, должны принимать параметры там как const & чтобы они могли захватывать временные объекты. Это также позволяет связывать операторов вместе, как foo + bar + cat

0

По вопросам рекламы [email protected]