Abstract class linking issue

R

Richard

First question - let's get this out of the way since it might be the
solution to all my woes: Does it make sense to have a .cpp file for a
class that is declared as having pure virtual functions in its .h file?

Here's my predicament. I'll put this in general terms since it's
happening across several classes.

I have a base class, let's say it's named A. In A.h I DECLARE several
pure virtual ( = 0) functions, a virtual destructor, and a constructor.
Note that each of these is terminated with a semicolon, hence they're
not DEFINED. There is also a file A.cpp which defines the constructor
and destructor with empty curly braces. A.cpp and A.h compile into a
library file (.a) with GCC without errors.

There's a class B that derives class A. All of the pure virtual
functions are overridden by B. Class B also has a default constructor
(no parameters) and destructor. Class B compiles into a library
without error also.

When I go to link my executable I include the two resulting libraries.
The linker produces the error "undefined reference to A::A()" which is
said to occur in the constructor for class B. I've ensured that the
folders containing A.h and B.h are in the "include search path", and
I've ensured that the libraries containing A and B are included during
linking.
 
V

Victor Bazarov

Richard said:
First question - let's get this out of the way since it might be the
solution to all my woes: Does it make sense to have a .cpp file for a
class that is declared as having pure virtual functions in its .h
file?

Sure, why not? If you want to provide definitions for the pure virtual
functions, you may. It's especially useful if you ever call any of the
functions from a c-tor of that class.
Here's my predicament. I'll put this in general terms since it's
happening across several classes.

I have a base class, let's say it's named A. In A.h I DECLARE several
pure virtual ( = 0) functions, a virtual destructor, and a
constructor. Note that each of these is terminated with a semicolon,
hence they're not DEFINED. There is also a file A.cpp which defines
the constructor and destructor with empty curly braces. A.cpp and
A.h compile into a library file (.a) with GCC without errors.

OK. Just so we are straight here, "compiles into a library" is not
defined in C++.
There's a class B that derives class A. All of the pure virtual
functions are overridden by B. Class B also has a default constructor
(no parameters) and destructor. Class B compiles into a library
without error also.
OK

When I go to link my executable I include the two resulting libraries.

Linking with libraries isn't defined either. It's known to work in
many compilers, but on every compiler that operation is specific to
the implemenation.
The linker produces the error "undefined reference to A::A()" which is
said to occur in the constructor for class B. I've ensured that the
folders containing A.h and B.h are in the "include search path", and
I've ensured that the libraries containing A and B are included during
linking.

Does it happen if you add all those files to the same project instead
of using "resulting libraries"? If it does not happen, then your
problem is not of C++ nature, sorry. If it does happen even if your
classes are both parts of the same _source_ file, let's see it.

For implementation-specific behaviour you need to ask in the newsgroup
dedicated to your compiler.

V
 
P

Pete Becker

Victor said:
Sure, why not? If you want to provide definitions for the pure virtual
functions, you may. It's especially useful if you ever call any of the
functions from a c-tor of that class.


OK. Just so we are straight here, "compiles into a library" is not
defined in C++.


Linking with libraries isn't defined either. It's known to work in
many compilers, but on every compiler that operation is specific to
the implemenation.


Does it happen if you add all those files to the same project instead
of using "resulting libraries"?

"add all those files to the same project" is not defined in C++.

--

-- Pete

Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." For more information about this book, see
www.petebecker.com/tr1book.
 
V

Victor Bazarov

Pete said:
Victor said:
Richard wrote: [...]
The linker produces the error "undefined reference to A::A()" which
is said to occur in the constructor for class B. I've ensured that
the folders containing A.h and B.h are in the "include search
path", and I've ensured that the libraries containing A and B are
included during linking.

Does it happen if you add all those files to the same project instead
of using "resulting libraries"?

"add all those files to the same project" is not defined in C++.

Something crawled up somewhere this fine morning, eh?

Replace 'project' with 'program'.

V
 
R

Richard

It turned out to be a linking order issue. I modified the order in my
Makefile and resolved all the "undefined reference" errors.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,828
Latest member
LauraCastr

Latest Threads

Top