3

私が取り組んでいるプロジェクトがありますが、それは実際にはずっと前に成功した学校のプロジェクトです。私はしばらくC++を実行していませんが、特にポインターを使用して、C++に戻るのに少し問題があります。私の質問は、このようなgetおよびset関数が必要かどうかです

    class Student
    {
    private:
            char firstName[64];
            char lastName[64];
    public:
            void setName(char *fName, char *lName);
            void getName(char *fName, char *lName);
    }


    void Student::setName(char *fName, char *lName);
    {
            firstName = *fName;
            lastName = *lName;
    }

getName関数を作成しようとすると、関数がvoidを返す状態で名前を返す方法について、非常に混乱しているようです。返すことができる値に値を設定すれば、実際に返す必要はないことは知っていますが、ポインターが錆びているので、これを機能させることができないようです。戻り値など、うまくいかないと思うことを試しましたが、このget関数で何ができるかわかりません。

    void Student::getName(char *fName, char *lName);
    {

    }

    int main()
    {
            char myFirstName[64] = "John"
            char myLastName[64] = "Doe"


    //testing to see if it's reading the char arrays correctly.
    cout << "Your Name is:" << myFirstName << " "  << myLastName << endl;


    Student aStudent;
    aStudent.setName(myFirstName, myLastName);

    //This part is where i'm confused.  and i'm sure some above is confusing as well.
    getStudent = aStudent.getName();

    }

コンストラクターを介してプライベート変数を返すことができると思いましたが、なぜget関数が必要なのですか?私はこの古い割り当てをやり直してc++に戻しています。私はより多くのネットワーク管理者の仕事をしていて、どうやら私の心を失うのに十分長い間これを無視していました。よろしくお願いします。さらに詳しい情報が必要な場合はお知らせください。徹底的に調査しました。

4

5 に答える 5

7

C-with-classes コードを自由に C++ コードに変換しました。

class Student
{
private:
        std::string firstName;
        std::string  lastName;
public:
        void setName(const std::string& fName, const std::string& lName);
        void getName(std::string& fName, std::string& lName);
}

getName関数は参照によってパラメーターを受け取るため、それらへの変更は関数の外部に反映されます。

void Student::setName(const std::string& fName, const std::string& lName);
{
        firstName = fName;
        lastName = lName;
}
void Student::getName(std::string& fName, std::string& lName);
{
        fName = firstName ;
        lName = lastName ;
}

int main()
{
    std::string myFirstName = "John"
    std::string myLastName = "Doe"


    //testing to see if it's reading the char arrays correctly.
    cout << "Your Name is:" << myFirstName << " "  << myLastName << endl;


    Student aStudent;
    aStudent.setName(myFirstName, myLastName);

ここでは、元は空returnedFirstNamereturnedLastName、関数内で変更されています。

    //This part is where i'm confused.  and i'm sure some above is confusing as well.
    std::string returnedFirstName;
    std::string returnedLastName;
    aStudent.getName(returnedFirstName,returnedLastName);
}
于 2012-08-01T15:51:53.707 に答える
4

char 配列の代わりに std::string を使用することをお勧めします。

したがって、getName 関数は次のようになります。

 std::string Student::getName()     {
    return firstName + lastName;
 }

ポインターを使用して void を返すこともできますが、より困難です。getName 関数を呼び出す前に、文字列を保持するために配列を割り当てる必要があります。コードは次のようになります。

char firstName[100]
char lastName[100];
aStudent.getName(firstName, lastName);

getName は次のようになります。

void Student::getName(char *fName, char *lName){
   strcpy(fName, firstName);
   strcpy(lName, lastName); 
}

最初のオプションはあなたの行く道です。

于 2012-08-01T15:53:28.503 に答える
2

パラメータなしでモデル化しました。だからあなたはする必要があります。

char f[64];
char l[64];
aStudent.getName(f, l);

また、私は混乱しています。それはまったく機能していますか?オブジェクトに格納charしているだけです。Studentどちらでもchar arrayないchar*

C++ には があり、std::string他のライブラリで動作することが明示的に要求されない限り、C スタイルの文字列を避けることがよくあります。

クラスをモデル化する方法はいくつかありますStudent

class Student{
  private:
     std::string firstName;
     std::string lastName;
  public:
     void setName(const std::string& fName, const std::string& lName);
     std::string getName() const;
     void getName(std::string& fname, std::string& lname) const;
}

std::string Student::getName() const{
    return firstName+" "+lastName;
}
void Student::getName(std::string& fname, std::string& lname) const{
    fname = firstName;
    lname = lastName;
}

姓と名の両方が必要な場合は、後にstd::pairまたは一緒にモデル化できますboost::tuple

class Student{
  public:
    typedef std::pair<std::string, std::string> NamePairT
  private:
     NamePairT _namePair;
  public:
     void setName(const NamePairT& namePair);
     NamePairT getName() const;
}


void Student::setName(const NamePairT& namePair) const{
    _namePair = namePair;
}
NamePairT Student::getName() const{
    return _namePair;
}

Student s;
s.setName(std::make_pair("Some", "One"));
Student::NamePairT name = s.getName();
std::cout << s.first << " " << s.second;
于 2012-08-01T15:48:03.960 に答える
2

まず、「作業」コード:

#include <string.h>

class Student
{
private:
        char firstName[64];
        char lastName[64];
public:
        void setName(const char *fName, const char *lName)
        {
            strcpy(firstName, fName);
            strcpy(lastName, lName);
        }

        void getName(char *fName, char *lName) const
        {
            strcpy(fName, firstName);
            strcpy(lName, lastName);
        }
};

さて、std::string代わりに使用する理由:

このコードは、バッファ オーバーフローに対してオープンです。名前が割り当てられた配列に収まらない場合はどうなりますか? の場合、使用可能なバッファのサイズがわかっているためsetName、これは を使用して克服できます。strncpyただしgetName、教授があなたに与えた署名には、宛先バッファーのサイズに関する情報がないため、最後を超えた書き込みから保護することはまったく不可能です。 std::string一方、どちらもバッファ サイズを認識しており、必要なだけのデータを格納するために再割り当てできるため、バッファ オーバーフローは発生しません。

于 2012-08-01T16:47:55.607 に答える
0

メソッドは void を返すためgetStudent = aStudent.getName();、意味がありません。*fName と *lName を aStudent の値に設定しようとしている場合は、次のようにすることができます。

void Student::getName( char *fName, char *lName ){
  fName = firstName;
  lName = lastName;
  }

メインの値を次のように設定します。

char *fName, *lName;
aStudent( fName, lName);
于 2012-08-01T15:50:34.953 に答える