有一个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/