By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,028 Members | 1,784 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,028 IT Pros & Developers. It's quick & easy.

Abstract class linking issue

P: n/a
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.

Oct 11 '06 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Richard wrote:
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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 11 '06 #2

P: n/a
Victor Bazarov wrote:
Richard wrote:
>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"?
"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.
Oct 11 '06 #3

P: n/a
Pete Becker wrote:
Victor Bazarov wrote:
>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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 11 '06 #4

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

Oct 12 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.