我试图将A的名称设置为“新名称”并返回A的引用
但是我从operator = function binary '=' : no operator found which takes a right-hand operand of type 'const char [6]' (or there is no acceptable conversion)
expression must be a modifiable value.
如果我只是执行return n = "new name";
,则会返回分段错误
请注意我的Account.cpp文件中的operator = function。
以下是我的三个文件:
main.cpp中:
#include <iostream>
#include "Account.h"
using namespace sict;
using namespace std;
int main(){
Account A;
Account B("Saving", 10000.99);
Account C("Checking", 100.99);
double value = 0;
cout << A << endl << B << endl << C << endl << "--------" << endl;
A = B + C;
A = "Joint";
cout << A << endl << B << endl << C << endl << "--------" << endl;
A = B += C;
cout << A << endl << B << endl << C << endl << "--------" << endl;
value += A;
value += B;
value += C;
cout << "Total balance: " << value << endl;
return 0;
}
这是我的Account.cpp我删除了我认为不必要的功能。 编辑:我将包括我的整个account.cpp和account.h
Account.cpp:
#include "cstring"
#include "iomanip"
#include "Account.h"
using namespace std;
namespace sict{
Account::Account(){
_name[0] = 0;
_balance = 0;
}
Account::Account(double balance){
_name[0] = 0;
_balance = balance;
}
Account::Account(const char name[], double balance){
strncpy(_name, name, 40);
_name[40] = 0;
_balance = balance;
}
void Account::display()const{
cout << _name << ": $" << setprecision(2) << fixed << _balance;
}
Account& Account::operator+=(Account &s1) {
// return Account(_balance += s1._balance);
_balance += s1._balance;
return *this;
}
Account& Account::operator=( Account& n) const {
strncpy(n._name,n,40);
return n;
}
double operator+=(double& d, const Account& a){
d += a;
return d;
}
ostream& operator<<(ostream& os, const Account& A){
A.display();
return os;
}
Account operator+(const Account &p1, const Account &p2){
return Account(p1._balance + p2._balance);
}
}
以下是运营商声明=在Account.h
#ifndef SICT_ACCOUNT_H__
#define SICT_ACCOUNT_H__
#include <iostream>
namespace sict{
class Account{
char _name[41];
double _balance;
public:
Account();
Account(const char name[], double balance = 0.0);
Account(double balance);
void display()const;
friend Account operator+(const Account &p1, const Account &p2);
Account& operator+=(Account& s1) ;
Account& operator=( Account& n) const;
};
Account operator+(const Account &p1, const Account &p2);
double operator+=(double& d, const Account& a);
std::ostream& operator<<(std::ostream& os, const Account& C);
};
#endif
任何帮助/提示都将不胜感激。
编辑:向operator =
添加了一些代码答案 0 :(得分:2)
你operator=
向后写了!
Account& Account::operator=( Account& n) const {
strncpy(n._name , n, 40);
return n;
}
应该是:
Account& Account::operator=(const Account& n){
strncpy(_name, n._name, 40);
return *this;
}
当您撰写A = B;
时,它就像A.operator=(B)
。因此A
将*this
(分配给的对象)和B
将是n
(原始的)。
但是你对实际使用有一个小问题。由于没有operator=
将字符串作为参数,因此您的代码为:
A = "new name";
实际上相当于:
A = Account("new name");
也相当于:
A = Account("new name", 0.0);
没有造成任何伤害,因为operator=
没有分配给余额,只分配给名称。但你可能不应该这样做......
我的建议,不要仅仅为了好玩而重载操作符:使用普通的成员函数。
PS:与strncpy
分开的问题,我没有进入那些。
答案 1 :(得分:0)
您无法分配数组。在您的情况下,您可以在数组中执行strncpy(就像在构造函数中所做的那样)。但是,一般来说,使用std :: string会更好。