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

C++ 回到c++;,带指针的void函数,如何生成get函数,c++,pointers,constructor,void,C++,Pointers,Constructor,Void,我有一个项目,我正在做,这实际上是一个学校的项目,我很久以前就成功了。我在一段时间内还没有做C++,我有点问题,尤其是指针。我的问题是,如果我需要这样的get和set函数 class Student { private: char firstName[64]; char lastName[64]; public: void setName(char *fName, char *lName);

我有一个项目,我正在做,这实际上是一个学校的项目,我很久以前就成功了。我在一段时间内还没有做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;
    }
void Student::getName( char *fName, char *lName ){
  fName = firstName;
  lName = lastName;
  }
当我尝试使用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();

    }
void Student::getName(char*fName,char*lName);
{
}
int main()
{
char myFirstName[64]=“John”
char myLastName[64]=“Doe”
//测试以查看它是否正确读取字符数组。

不能你已经在没有参数的情况下对它进行了建模。 所以你需要这样做

char f[64];
char l[64];
aStudent.getName(f, l);
我也很困惑。它到底能工作吗?你只是把
char
存储在
Student
对象中。它既不是
char数组,也不是
char*

<>在C++中,有一个<代码> STD::String ,并且除非明确地要求与其他库一起工作,否则我们经常避免C风格字符串。 有几种方法可以模拟你的
学生
班级

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;
班级学生{
公众:
typedef std::pair NamePairT对
私人:
NamePairT\u namePair;
公众:
void setName(const NamePairT&namePair);
NamePairT getName()常量;
}
void Student::setName(const NamePairT&namePair)const{
_名称对=名称对;
}
NamePairT学生::getName()常量{
返回_namePair;
}
学生证;
s、 集合名(std::make_pair(“Some”,“One”);
Student::NamePairT name=s.getName();

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

    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;
    }
void Student::getName( char *fName, char *lName ){
  fName = firstName;
  lName = lastName;
  }
并在main中设置如下值:

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

我已经自由地把C类代码转换成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);
    //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;
 }
char firstName[100]
char lastName[100];
aStudent.getName(firstName, lastName);
void Student::getName(char *fName, char *lName){
   strcpy(fName, firstName);
   strcpy(lName, lastName); 
}
使用指针和返回void也可以做到,但更为困难。在调用getName函数之前,必须分配一个数组来保留字符串。您的代码应该如下所示:

 std::string Student::getName()     {
    return firstName + lastName;
 }
char firstName[100]
char lastName[100];
aStudent.getName(firstName, lastName);
void Student::getName(char *fName, char *lName){
   strcpy(fName, firstName);
   strcpy(lName, lastName); 
}
您的getName应该如下所示:

 std::string Student::getName()     {
    return firstName + lastName;
 }
char firstName[100]
char lastName[100];
aStudent.getName(firstName, lastName);
void Student::getName(char *fName, char *lName){
   strcpy(fName, firstName);
   strcpy(lName, lastName); 
}
第一个选项是您的工作方式。

首先,“工作”代码:

#包括
班级学生
{
私人:
charfirstname[64];
char lastName[64];
公众:
void setName(常量字符*fName,常量字符*lName)
{
strcpy(名字,fName);
strcpy(姓氏,lName);
}
void getName(char*fName,char*lName)常量
{
strcpy(fName,firstName);
strcpy(lName,lastName);
}
};
现在,为什么要使用
std::string


此代码可能会出现缓冲区溢出。如果名称不适合分配的数组,该怎么办?对于
setName
,可以使用
strncpy
克服此问题,因为可用缓冲区的大小是已知的。但是,对于
getName
,教授给您的签名没有关于目标bu大小的信息FFER,所以完全不可能防止写结束。<代码>:ST::String ,另一方面,都知道它的缓冲区大小,并且可以重新分配以存储所需的数据,因此缓冲区溢出不会发生。

主题,但是如果是C++,为什么不使用字符串而不是字符??这会让生活更轻松一些……你的课全错了,除非名字和姓氏是首字母。@BenjaminLindley我应该说得更清楚些。我描述的方法肯定不是最好的方法。这是老师要求做的,我不知道为什么。已经六年了因为我在课堂上,所以我不记得他为什么要这样做,也不记得我以前是怎么做的,但我确实保存了所有的作业。至于课堂上的错误,我只是忘了把数组放在最后一行[64]我只知道老师想要两个私有变量,一个get和set函数,都是void,都有相同的参数,而且都是参数are@Slimmons我认为没有理由学习一种低级的C风格的C++字符串处理方法,也不应该继续练习。C字符串是有问题的,C++固定的NEA。R>所有的问题都是在代码> STD::String 。你被这样做的最有可能的原因是一个来自强大C背景的老师,还没有进入C++的做事方式。在互联网上有很多例子来说明如何使用指针和C风格字符串。这个例子是在坏的例子中。它闻起来了!忘记了!如果您想学习C++中的字符串,请查看下面的任何答案,其中使用<代码> STD::String < /C> > [未声明变量] = [调用空返回类型函数](最后一行在main)下面是列出的要求,我再次强调,我不是在寻找最好的方法,我知道有几种更简单的方法,但是赋值将其列为函数void getName(char*fName,char*lName)void setName(char*fName,char*lName),我不知道为什么