gpt4 book ai didi

c - 用 C 实现类

转载 作者:行者123 更新时间:2023-11-30 18:33:30 25 4
gpt4 key购买 nike

有一个 person(class) 的构造函数。为什么不呢

    pObj->pFirstName = pFirstName;
pObj->pLastName = pLastName;

我不明白他这样写的目的。

pObj->pFirstName = malloc(sizeof(char)*(strlen(pFirstName)+1));
if (pObj->pFirstName == NULL)
{
return NULL;
}
strcpy(pObj->pFirstName, pFirstName);

两者有什么区别吗?
我没明白。我没明白。我没明白。我没明白。我没听懂。

typedef struct _Person Person; //declaration of pointers to functions typedef void    (*fptrDisplayInfo)(Person*); typedef void    (*fptrWriteToFile)( Person*, constchar*); typedef void    (*fptrDelete)( Person *) ; typedef struct _Person  {
char* pFName;
char* pLName;
//interface for function
fptrDisplayInfo Display;
fptrWriteToFile WriteToFile;
fptrDelete Delete; }Person;

Person* new_Person(const char* const pFirstName,
const char* const pLastName); //constructor void delete_Person(Person* const pPersonObj); //destructor void Person_DisplayInfo(Person* const pPersonObj); void Person_WriteToFile(Person* const pPersonObj, const char* pFileName);

person* new_Person(constchar* const pFirstName, constchar* const pLastName) {
Person* pObj = NULL;
//allocating memory
pObj = (Person*)malloc(sizeof(Person));
if (pObj == NULL)
{
return NULL;
}
pObj->pFirstName = malloc(sizeof(char)*(strlen(pFirstName)+1));
if (pObj->pFirstName == NULL)
{
return NULL;
}
strcpy(pObj->pFirstName, pFirstName);

pObj->pLastName = malloc(sizeof(char)*(strlen(pLastName)+1));
if (pObj->pLastName == NULL)
{
return NULL;
}
strcpy(pObj->pLastName, pLastName);

//Initializing interface for access to functions
pObj->Delete = delete_Person;
pObj->Display = Person_DisplayInfo;
pObj->WriteToFile = Person_WriteToFile;

return pObj; }

最佳答案

第一个版本将一个指针设置为另一个指针。结束。

第二个版本分配并复制一个指针引用的 C 样式字符串到另一个内存缓冲区,然后设置第二个指针指向它。

这样做的原因有很多,它们与类和所有权概念直接相关。

在第一种情况下,如果原始指针指向的任何内存被释放/销毁,则取消引用现在无效的指针将成为未定义的行为。

在第二种情况下,类有自己的原始文本字符串副本,该副本仍然有效。当然,为了避免内存泄漏,当类实例被销毁时,它也应该销毁它最初分配的内存缓冲区。您应该在负责销毁此类实例的任何代码中看到这种情况发生。

关于c - 用 C 实现类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57024221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com