3

私が書いているクラスで、テキストファイルにある次のデータのID番号、名、姓、中間スコア、および最終スコアのゲッターとセッターを作成するコードを作成しようとしています.. .

10601   ANDRES HYUN 88 91 94 94 89 84 94 84 89 87 89 91 
10611   THU ZECHER 83 79 89 87 88 88 86 81 84 80 89 81 
10622   BEVERLEE WAMPOLE 95 92 91 96 99 97 99 89 94 96 90 97 
10630   TRUMAN SOVIE 68 73 77 76 72 71 72 77 67 68 72 75 

ID は最初の数字、姓と名は一目瞭然、中間スコアは最後から 2 番目の数字、最後の数字は最終スコアです。ゲッターとセッターを使用するのはこれが初めてで、これまでのところ...

int getID()const{return ID;}
void setID(int i) {ID=i}
string getFname()const{return Fname;}
void setFname(string f) {Fname = f}
string getLname()const{return Lname;}
void setLname(string l) {Lname = l}
int getMidterm()const{return Midterm;}
void setMidterm(int m) {Midterm=m}
int getFinal()const{return Final;}
void setFinal(int fl) {Final=fl}

私はまったく正しい軌道に乗っていますか?また、データ セットの最初の数字が ID、最初の文字列が名前、2 番目の文字列が 2 番目の名前、最後から 2 番目の数字が中間期、最後の数字が最終スコアであることを指定するにはどうすればよいですか?

4

3 に答える 3

5

ゲッターとセッターの作成について質問している場合は、そうです。多くの人がそれを行っています。複合型への「完全な」アクセサーを作成するには、次のようにします。

void setLname(const String& input) { Lname = input; }    //copies the string
void setLname(String&& input) { Lname = std::move(input); }    //moves the string
const String& getLname() const { return Lname; }    //allows to get a const String reference from a const object
String& getLname() { return Lname; }    //allows modifying access to Lname if the object is not const.

これは 2 つ以上であることに注意してください。人々は通常、ゲッターとセッターを 1 つしか見ません。それ以上のことを書きたいと思う人はごくわずかです。ただし、これら 4 つのそれぞれは、実行する作業が少し異なるため、追加することをお勧めします。

ただし、多くのアクセサーはコードのにおいがします。

  1. それらは、抽象化を提供しない関数でコードを散らかします。

  2. getter と setter の両方がある場合は常に、そのデータ メンバーに実質的に無制限にアクセスできます。だから、あなたは同じように書いたかもしれませんpublic: String Lname.

  3. 多くのアクセサーは、動作ではなく、データをモデリングしていることを示しています。そのような場合は、設計を再考するか、正直に言ってパブリック メンバーを使用するか、すべてのメンバーがパブリックの場合はstructIMHO を使用する必要があります。

ここでは、値の範囲をチェックしたり、それに応じて他のメンバーを更新したりするなど、実際に賢明なことを行う純粋なアクセサーについて話しているのではなく、純粋なアクセサーについて話していることに注意してください。そして、これらの純粋なものは避けるべきです。

だから、もし私があなただったら、自問するでしょう:私のクラスにはどのような行動が必要ですか?そのすべてのデータ メンバーについて他のコードで本当に話す必要があるのでしょうか。それとも、アクセサーを役に立たなくするクラスが提供できる賢明な抽象化を見つけることができるでしょうか。間違ったクラスのオブジェクトをモデル化することを考えている可能性はありますか? それとも、どこでも使用および変更できるデータ用のコンテナーが本当に必要ですか?

于 2013-09-13T19:11:29.077 に答える
1

うまく見えます。いくつかのコメント:

  • 無駄なコピーをしないようにパスstringします。const string&
  • 空白を増やすと読みやすくなります
  • 物事を短縮しないでください。getFirstName()よりも読みやすいgetFname()

2 番目の質問については、、、、、、、、などscanfのC++ で利用可能な多くのスキャン/ストリーム ユーティリティを使用できsscanfます。fscanfstringstreamiostreamfstream

std::ifstream inFile("database.txt");
std::string line;
while (std::getline(inFile, line)) // for each line
{
    std::stringstream ss;
    ss << line;

    int id;
    ss >> id;

    std::string firstName;
    ss >> firstName;

    // etc
}
于 2013-09-13T02:53:27.213 に答える
-1

パート 1:
getter メソッドと setter メソッドはまさにそのように見えるはずです (少なくとも Java では)。

パート 2:
クラスのフィールドを設定するには、入力を手動で解析する必要があります。C++ iostream、特に入力ストリームの>> 演算子を調べることをお勧めします。

于 2013-09-13T02:51:51.593 に答える