c ++运算符函数

时间:2015-11-04 17:02:52

标签: c++ function operator-keyword

我试图将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 =

添加了一些代码

2 个答案:

答案 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会更好。