用C实现类

时间:2019-07-14 02:49:56

标签: c

有一个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; }

3 个答案:

答案 0 :(得分:2)

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

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

这样做的原因有很多,它们直接与类以及所有权的概念联系在一起。

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

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

答案 1 :(得分:1)

如果仅分配指针,则结构包含指向调用者字符串的指针。如果调用者的字符串超出范围,或者调用者释放了它,则指针将不再有效。而且,如果他们修改了自己的字符串,它也会修改结构中的字符串。

制作字符串的副本可确保一旦将其放入结构中,就不会依赖于调用者的字符串。

答案 2 :(得分:0)

第一个仅对pFirstName / pLastName进行浅表复制

第二个进行硬拷贝。 -它在堆上分配另一个副本。