Anonymous Guy
Anonymous Guy

Reputation: 3

linking hpp and cpp issues with g++ compiler

I am relatively new to c++ and have a solid C and Object Oriented background. So I have the following code written. I have Person.hpp which is as follows:

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();
};

The Person.cpp looks as follows:

#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;
}

And finally main.cpp looks like the following:

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

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

I am already aware of the warning that it will cause due to the fact that the string is not constant. This will not cause an error when trying to compile. I tried compiling the code in two different methods. One by just compiling all together which would look like the following:

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

And the second method I tried was to compile them into object files and then link them together:

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

They both give the following error:

/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

Any help would be greatly appreciated.

Upvotes: 0

Views: 768

Answers (2)

martensi
martensi

Reputation: 81

The problem is that you declare both an constructor and destructor in Person.hpp, but only define the constructor in the Person.cpp file.

Try add the following code to Person.cpp:

Person::~Person()
{
}

Upvotes: 1

ph3rin
ph3rin

Reputation: 4896

You have a destructor declared here in your header file:

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

But you haven't provided any definitions for it.

However, the destructor is called after your main function returns (you can learn more about this behavior here), so it needs a definition.

You can make the compiler generate the definition for you by either omitting the destructor declaration or use ~Person() = default.

Upvotes: 1

Related Questions