0

私はC++をブラッシュアップしていて、toString関数が定義したフォーマット済みの文字列を出力しない理由を理解しようとしています。

私が参照している関数は次のとおりです。friend std::ostream& operator<<(std::ostream&, const Employee&);

Employee.cpp

#include <iostream>
#include <stdio.h>
using namespace std;

class Employee {
  private:
    string name;
    double rate;
    double hours;
    double getPay() const;
    friend std::ostream& operator<<(std::ostream&, const Employee&);
  public:
    Employee(string, double);
    void setHours(double);
};

Employee::Employee(string name, double rate) {
  this->name = name;
  this->rate = rate;
  this->hours = 0;
}

void Employee::setHours(double hours) {
  this->hours = hours;
}

double Employee::getPay() const {
  double gross = this->hours * this->rate;
  double overtime = this->hours > 40 ? 
      (this->hours - 40) * (this->rate * 1.5) : 0;
    return gross + overtime;
}

// toString
std::ostream& operator<<(std::ostream &strm, const Employee &e) {
  char buff[64];
  return strm << sprintf(buff, "Name: %s, Salary: $%.2f\n",
    e.name.c_str(), e.getPay());
}

int main (int* argc, char** argv) {
  Employee emp1("Bob", 28);
  Employee emp2("Joe", 32);
  emp1.setHours(44);
  emp2.setHours(25);
  cout << emp1 << endl;
  cout << emp2 << endl;
  return 0;
}
4

3 に答える 3

6

sprintf戻り値:

  • 成功すると、書き込まれた文字の総数が返されます。このカウントには、文字列の最後に自動的に追加される追加のヌル文字は含まれません。
  • 失敗すると、負の数が返されます。

いかなる条件でも文字列を返しません。常に文字列を返します。これは、int要求に応じて出力されるものです。おそらくあなたはこれが欲しいでしょう:

char buff[64];
sprintf(buff, "Name: %s, Salary: $%.2f\n",
  e.name.c_str(), e.getPay());
return strm << buff;

CC++の標準ライブラリを混在させるのではなく、ストリームに固執した方がよいでしょう。

return strm << "Name: " << e.name << ", Salary: $" << std::setprecision(2) << e.getPay() << "\n";
于 2013-01-12T00:30:21.580 に答える
2

それは実際にはostreamsが機能する方法ではありません。実際、sprintfを調べると、戻り値をstrmに出力したくないことがわかります。代わりに、bufを印刷する必要があります。何かのようなもの:

std::ostream& operator<<(std::ostream &strm, const Employee &e) {
  char buff[64];
  sprintf(buff, "Name: %s, Salary: $%.2f\n",
    e.name.c_str(), e.getPay());
  return strm << buff;
}

sprintfとostreamを混在させることはお勧めできませんが、少なくともコードは機能します。

于 2013-01-12T00:31:49.130 に答える
1

C/C++ コードを混ぜて純粋な C++ コードを書くのは悪い習慣です。

std::ostream& operator<<(std::ostream &strm, const Employee &e) 
{  
  strm << "Name: " << e.name << " Salary: $" << std::setprecision(2) << e.getPay();
  return strm;
}
于 2013-01-12T00:34:43.940 に答える