将 hpp 和 cpp 问题与 g++ 编译器联系起来

linking hpp and cpp issues with g++ compiler

我是 c++ 的新手,具有扎实的 C 和面向对象背景。所以我写了下面的代码。 我有 Person.hpp 如下:

class Person
{
    private:
        struct h
        {
            char *name;
            unsigned char age;
        };
        struct h entities;
    public:
        unsigned char age();
        char *name();
        Person(char *name, unsigned char a);
        ~Person();
};

Person.cpp 看起来如下:

#include "Person.hpp"


char *Person::name()
{
    return entities.name;
}

unsigned char Person::age()
{
    return entities.age;
}

Person::Person(char *name, unsigned char a)
{
    entities.name = name;
    entities.age = a;
}

最后 main.cpp 如下所示:

#include <iostream>
#include "Person.hpp"

int main()
{
    Person someone("something", 100);
    printf("%s is %d old\n", someone.name(), someone.age());
    return 0;
}

我已经知道由于字符串不是常量而导致的警告。这不会在尝试编译时导致错误。我尝试用两种不同的方法编译代码。一种是将所有内容编译在一起,如下所示:

g++ -o main main.cpp Person.cpp

我尝试的第二种方法是将它们编译成目标文件,然后 link 将它们放在一起:

g++ -c main.cpp
g++ -c Person.cpp
g++ -o main main.o Person.o

他们都给出了以下错误:

/usr/bin/ld: main.o: in function `main':
main.cpp:(.text+0x5b): undefined reference to `Person::~Person()'
/usr/bin/ld: main.cpp:(.text+0x6e): undefined reference to `Person::~Person()'
collect2: error: ld returned 1 exit status

如有任何帮助,我们将不胜感激。

您在头文件中声明了一个析构函数:

public:
   unsigned char age();
   char *name();
   Person(char *name, unsigned char a);
   ~Person();   // <===== Declared here

但是您还没有为它提供任何定义。

但是,析构函数是在您的 main 函数 returns 之后调用的(您可以了解有关此行为的更多信息 here),因此它需要一个定义。

您可以通过省略析构函数声明或使用 ~Person() = default.

让编译器为您生成定义

问题是您在 Person.hpp 中同时声明了构造函数和 destructor,但只在 Person.cpp 文件中定义了构造函数。

尝试将以下代码添加到 Person.cpp:

Person::~Person()
{
}