[C++-sig] Limit On No. Of Constructors?

David Abrahams dave at boost-consulting.com
Thu Nov 14 19:50:31 CET 2002


"Scott A. Smith" <ssmith at magnet.fsu.edu> writes:

> Hi Dave,
>
>> You need to either get a better compiler (even vc7 would be an
>> improvement), or split your module code across translation units
>> (source files). To do that, declare a function in another source file
>> taking a class_<SinglePar>& parameter, and move some of your .def()
>> calls there.
>
> In another message you wrote:
>
>> Split up your file into multiple translation units (separate source
>> files). Your module initialization function can call a function
>> defined in another source file to expose additional functionality.
>
> Ouch. It'll be a while before I can upgrade to .NET, but I am trying to
> build my modules multiplatform so I run with GCC using CygWin & Linux (& one
> day
> perhaps even OSX). 

We're looking for a workaround for this VC6 bug. Maybe Monday (but
maybe never).

> But for now, I am hoping you can clarify your statements
> on how to deal with the vc6 problem.
>
> 1.) When I declare a class:
>
>   class_<MyClass>("MyClass", init<>())
>    ... class constructors and functions
>   ;
>
>    it would seem that all .def() calls for the class must reside before
>    the semi-colon used for the class end. Hence, I don't see how I can move
> any
>    of these into a separate file.  

See
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/boost/boost/libs/python/doc/v2/faq.html#c1204

> I have no problems moving entire classes
>    into individual files. I don't understand how I can use a
> class_<MyClass>&
>    parameter in a different file then continue putting in .def() calls that
>    are part of the class MyClass. Could you give me a brief example?
>
> 2.) Is it possible to blend modules. That is, make a Python module that has
>     class A, one that has class B, then somehow blend the two into a single
>     module. Then only the summed moduled is imported into Python rather than
>     all of the individual ones?

No, but you don't need two module definitions.

> 3.) I keep all my BP functions in separate files, except those functions
> that
>     needed to be part of a class (e.g. for weak wrapping using V1). I have
>     always done this using header files, so the structure of my code is
> quite
>     different from all of the tutorial examples. I am wondering if, for
> whatever
>     reasons, I should be keeping my BP functions in (.cpp) files instead?
>     Currenty I have a single header file that contains, among other things,
>
>      BOOST_PYTHON_MODULE(MyModule)
>       {
> #     include <FileA.h>
> #     include <FileB.h>
> .
> .
>       }
>
>     Is there a better, or more standardized, way of organizing my code while
>     keeping what is related to BP largely away from what is my project's
>     usual C++ code?

Generally speaking, #including headers into the interior of
Boost.Python module initialization functions won't work out
well. Maybe you should try:

  // module file
  extern void wrap1();
  extern void wrap2();
  BOOST_PYTHON_MODULE(MyModule)
  {
    wrap1();
    wrap2();
  }


  // wrap1.cpp
  #include <header1.h>
  void wrap1
  {
     ... // wrapping code for header1.h
  }


  // wrap2.cpp
  #include <header2.h>
  void wrap2()
  {
     ... // wrapping code for header2.h
  }

But note: this is not a Boost.Python question, it's a C++
question. There's nothing special about file organization for
Boost.Python projects that doesn't apply to run-of-the-mill C++
(except for freaky compiler limitations like c1204). If you have more
questions about this, please consider asking them in a general C++
forum.

-- 
                       David Abrahams
   dave at boost-consulting.com * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution





More information about the Cplusplus-sig mailing list