Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Abstract class linking issue

Reply
Thread Tools

Abstract class linking issue

 
 
Richard
Guest
Posts: n/a
 
      10-11-2006
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.

 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      10-11-2006
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


 
Reply With Quote
 
 
 
 
Pete Becker
Guest
Posts: n/a
 
      10-11-2006
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.
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-11-2006
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


 
Reply With Quote
 
Richard
Guest
Posts: n/a
 
      10-12-2006
It turned out to be a linking order issue. I modified the order in my
Makefile and resolved all the "undefined reference" errors.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
what is the difference between abstract class and pure abstract class? skishorev@yahoo.co.in C++ 4 05-17-2006 08:07 AM
Abstract Methods & Abstract Class Iyer, Prasad C Python 0 10-20-2005 06:35 AM
About abstract class and abstract method Sameer Java 4 08-31-2005 12:59 AM
Deriving abstract class from non-abstract class Matthias Kaeppler Java 1 05-22-2005 01:28 PM
Abstract class with no abstract functions Uzytkownik C++ 3 04-03-2005 05:45 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57