回到c++,带指针的void函数,如何生成get函数

getting back into c++, void function with pointers, how to make get function

本文关键字:函数 get 何生成 void c++ 指针 回到      更新时间:2023-10-16

我正在做一个项目,实际上是我很久以前成功完成的一个学校项目。我已经有一段时间没有做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++中,我一直在做更多的网络管理工作,但忽略了这一点很长时间,显然我失去了理智。提前谢谢,如果你需要更多信息,请告诉我,我尽力做到面面俱到。

我已经自由地将您的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);
}

我建议您使用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); 
}

第一个选择是你的路。

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

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::pairboost::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;

首先,"工作"代码:

#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都知道其缓冲区大小,并且可以根据需要重新分配以存储尽可能多的数据,因此缓冲区溢出不会发生。

您的方法返回void,因此getStudent = aStudent.getName();没有任何意义。如果您试图将*fName和*lName设置为aStudent的值,您可以执行类似的操作

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

并设置主要值,例如:

char *fName, *lName;
aStudent( fName, lName);