3

我有一个我正在做的项目,它实际上是我很久以前成功完成的一个学校项目。我已经有一段时间没有使用 C++ 了,我在重新开始使用 C++ 时遇到了一些问题,尤其是使用指针时。我的问题是,如果我需要这样的获取和设置功能

    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

我建议您使用 std::string 而不是 char 数组。

因此,您的 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

您已经使用 out 参数对其进行了建模。所以你需要做。

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

我也很困惑。它甚至可以工作吗?你只是存储char在你的Student对象中。既不是 achar array也不是 achar*

在 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;
  }

并在 main 中设置值,例如:

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