回到c++,带指针的void函数,如何生成get函数
getting back into c++, void function with pointers, how to make get function
我正在做一个项目,实际上是我很久以前成功完成的一个学校项目。我已经有一段时间没有做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);
这里,原来空的returnedFirstName
和returnedLastName
在函数内部被修改:
//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::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;
首先,"工作"代码:
#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);
- C++中是否有任何函数等同于python中字典的get函数?
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 使用"push_back"作为带有"get"函数C++的向量
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- c++ 在类中声明私有的向量,但有一个 get 函数
- c++为什么ifstream get()函数返回无法识别的特殊字符
- 使用Set/Get-like方法或GetSet组合函数
- 为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
- 如何在输入成员函数中使用 get()
- C++ :: 设置值函数在函数内设置,但后跟 Get 函数,设置值消失了
- 为什么 ADL 不能使用 std::get 解析为正确的函数
- 在类中使用映射并通过其他类的 get() 和 set() 函数访问值
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- get 函数返回无效值
- cin.get()函数在C 中
- 通过引用将私有类实例传递到另一个类 C++ 的"get"函数中
- 类成员函数 get 不会返回值
- ifstream 函数"get"如何改变其字符参数?
- 重载运算符()与成员函数get()
- 输入流函数get在c++中