home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Journal 1990 - 1995 / CUJ.iso / unix / 1992.txt < prev    next >
Text File  |  1996-02-07  |  3MB  |  100,450 lines

  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.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613. Porting C Libraries To C ++
  614.  
  615.  
  616. David Brumbaugh
  617.  
  618.  
  619. David Brumbaugh is a project manager at Advanced Information Services, a
  620. systems integrator in Peoria, IL. He has been programming in C for over five
  621. years and in C++ for over a year. He can be reached by mail at 2807 N. Renwood
  622. Ave., Peoria, IL 61604.
  623.  
  624.  
  625. Most C programmers have large investments in existing C libraries. If C++ is
  626. to fulfill the promise of reusable software, the C libraries of today cannot
  627. suddenly become obsolete. Usually, existing libraries can be given "OOPness"
  628. by encapsulating their functions in C++ classes. Furthermore, if those classes
  629. are well-designed, they can enhance an application's portability, readability,
  630. and maintainability.
  631.  
  632.  
  633. C++ And C
  634.  
  635.  
  636. For all practical purposes, C++ is a superset of C. C++ can be linked with
  637. code compiled by a C compiler if the functions are prototyped and enclosed in
  638. the linkage specifier:
  639. extern "C" { }
  640. This declaration lets you use C libraries directly, without modification. Of
  641. course, you must have a compatible object file to begin with. You can link a
  642. Turbo C 2.0 library and a Turbo/Borland C+ + program, but you cannot use the
  643. declaration to link a Turbo/Borland C+ + program and a Microsoft C 5.1
  644. library. (I know because I tried.) While this scheme doesn't exploit C+ +'s
  645. bent towards OOP, almost anything your old C libraries can do can be made to
  646. work in C++.
  647.  
  648.  
  649. Terms
  650.  
  651.  
  652. Cutting away the object-oriented jargon leaves little difference between a
  653. method and a function. Objects contain both data and functions. In OO jargon,
  654. these are attributes and methods. (For the purposes of this article, I use
  655. "method" to denote a class's member function and "function" to mean a
  656. traditional C function.) In many cases libraries already contain most of the
  657. code for the methods. To make the libraries OO, you simply need to wrap
  658. classes around the libraries.
  659.  
  660.  
  661. Preparation
  662.  
  663.  
  664. In many cases, it is not necessary to wrap libraries. A library that is not
  665. often used or has no common thread probably is not a candidate for wrapping.
  666. On the other hand, a method may need some functions found in a library that is
  667. not wrapped itself. In this case, simply enclose the C function in extern "C"
  668. { } and call it as necessary. Often you can use conditional compilation in the
  669. library's header file. (See Listing 1. The __cplusplus macro is Turbo/Borland
  670. C++ specific.)
  671. Before wrapping a class around a library, ask yourself what advantages you
  672. expect. Typically, these might include:
  673. Common Access. By overloading methods, it isn't necessary to create functions
  674. named replaceString, replaceInt, replaceReal. A replace method will suffice.
  675. Code becomes more readable and, in turn, more maintainable.more readable and,
  676. in turn, more maintainable.
  677. Reusable Code. Object-oriented code is more reusable because it encourages
  678. encapsulation. In traditional programming, programmers tend to reuse code by
  679. using an editor's "cut and paste" functions. While this works, the same code
  680. in different locations frequently requires slight changes in variable names,
  681. function names, or control structures. An object-oriented style enhances code
  682. reusability by localizing and formalizing the areas being changed.
  683. Localized Impact of Changes. Changes in understanding, requirements, and
  684. design prompt changes in program code. A typical problem arises when two areas
  685. of a program call the same function. If that function is subsequently modified
  686. to accommodate a change in one of the two areas, the other area may behave
  687. improperly. An object-oriented solution creates a descendant of the object in
  688. the first area, where the change is needed. All other code remains the same.
  689. Again, the change is local and formal.
  690. Portability of Applications. By isolating platform-specific libraries from
  691. your application in private and protected methods, you can change the
  692. implementation details of a specific class without touching the actual
  693. application code (this is a variation on number three). While preparing to
  694. wrap the library in a class, remember that in C++, all functions need
  695. prototypes. Most libraries come with a header file containing the prototypes.
  696. If your library doesn't come with such a header file, you must make one in
  697. order to use the functions in C++.
  698. C++ has several keywords not found in C: asm, catch, class, delete, friend,
  699. inline, new, operator, private, protected, public, template, this and
  700. virtual[1]. If any of your library functions have these names, you will have
  701. problems. To work around this, remove the prototype of the offending function
  702. from the header file using conditional compilation. Write a new function, with
  703. a different name, in C that calls the library function (see Listing 2 for an
  704. example).
  705. The final consideration for encapsulation concerns the availability of source
  706. code. If you have purchased the source code for a commercial library, you may
  707. want to avoid the overhead of wrapping, and simply use the cut and paste
  708. method to build classes from the original source.
  709.  
  710.  
  711. Designing Classes Around Libraries
  712.  
  713.  
  714. Since a class encapsulates both data and functions, you must identify data
  715. structures in the library that can become attributes of your class. As a
  716. general rule, data structures should be made protected variables. You will
  717. want to group common functions and data structures into a class.
  718. Once you have identified the common data structures, determine the class
  719. protocol. A class protocol is the list of methods used to send messages to
  720. objects of the class. In C++, the class protocol is the set of public methods
  721. and data items. Use generic names for the methods in your protocol. A database
  722. library may have several read functions: db_read_int(), db_read_str(),
  723. db_read_float(), etc. The protocol for this set of functions would be read(int
  724. &), read(char *), read(float &), etc. The bodies of these methods would
  725. contain calls to the proper library functions.
  726. Avoid the temptation to give class methods library-specific names. Create
  727. general classes that permit inheritance in the future. For example, a generic
  728. database class could have descendants that call two completely different
  729. database libraries. Changing from one database to another would require no
  730. changes to the application.
  731. Just because a function is in a library does not mean it must be represented
  732. in the class. In the example that follows, the Pfm_List class concerns itself
  733. with a single table in a database. It does not need database creation or
  734. administration functions.
  735. Round out the class with internal methods. In C++, methods designated as
  736. private or protected are internal and are used by other methods. The library
  737. will generally dictate the internal methods, but don't allow it to dictate the
  738. overall class concept.
  739.  
  740.  
  741. Pinnacle File Manager Tables
  742.  
  743.  
  744. I have translated into C+ + an example that I wrote for an earlier CUJ
  745. article, "Object-Oriented Programming In C" (July 1990). I used the Pinnacle
  746. File Manager v3.5 by Vermont Database Corporation as the library to
  747. encapsulate. (If you wish to run the code in the examples, you can obtain a
  748. free sample disk that is limited to 100 records per table from Vermont
  749. Database Corporation by calling 802-253-4437.)
  750. I first needed to decide how to implement the list concept I presented in July
  751. 1990. Turbo C++ came with a Container class library, which met some of the
  752. needs I was trying to meet with the LIST_CLASS. Should I try to fit my code
  753. into their hierarchy or create my own hierarchy? I finally decided to use my
  754. own. This hierarchy is shown in Figure 1.
  755. A D_List defines the operations you would normally