errors result when creating header file - visual c++

Discussion in 'C++' started by soni29, Sep 6, 2003.

  1. soni29

    soni29 Guest

    hi,
    i have written the following code, still in the learning stage:
    #include<iostream.h>

    class CBox {

    public:
    // Constructor definition
    CBox(double lv, double bv = 1.0, double hv = 1.0) : m_Length(lv),
    m_Breadth(bv), m_Height(hv)
    {
    cout << endl << "Constructor called";
    }

    // Default Constructor
    CBox() {
    cout << endl
    << "Default constructor called.";
    m_Length = m_Breadth = m_Height = 1.0;
    }

    // Function to calculate the volume of a box
    double Volume() const {
    return m_Length * m_Breadth * m_Height;
    }

    private:
    double m_Length;
    double m_Breadth;
    double m_Height;
    };


    int main() {
    CBox boxes[5];
    CBox cigar(8.0, 5.0, 1.0);

    cout << endl
    << "Volume of boxes[3] = " << boxes[3].Volume()
    << endl
    << "Volume of cigar = " <<cigar.Volume();

    cout << endl;
    return 0;
    }


    when i try to break it into a header and source file, 2 separate
    files, i get errors:
    source file:
    #include <iostream.h>
    class CBox;

    int main() {
    CBox boxes[5];
    CBox cigar(8.0, 5.0, 1.0);

    cout << endl
    << "Volume of boxes[3] = " << boxes[3].Volume()
    << endl
    << "Volume of cigar = " <<cigar.Volume();

    cout << endl;
    return 0;
    }


    CBox.h:
    #include<iostream.h>

    class CBox {

    public:
    // Constructor definition
    CBox(double lv, double bv = 1.0, double hv = 1.0) : m_Length(lv),
    m_Breadth(bv), m_Height(hv)
    {
    cout << endl << "Constructor called";
    }

    // Default Constructor
    CBox() {
    cout << endl
    << "Default constructor called.";
    m_Length = m_Breadth = m_Height = 1.0;
    }

    // Function to calculate the volume of a box
    double Volume() const {
    return m_Length * m_Breadth * m_Height;
    }

    private:
    double m_Length;
    double m_Breadth;
    double m_Height;
    };


    \Microsoft Visual Studio .NET\Vc7\include\useoldio.h(29): warning
    C4995: '_OLD_IOSTREAMS_ARE_DEPRECATED': name was marked as #pragma
    deprecated
    Test.cpp(5): error C2133: 'boxes' : unknown size
    Test.cpp(5): error C2512: 'CBox' : no appropriate default constructor
    available
    Test.cpp(5): error C2262: 'boxes' : cannot be destroyed
    Test.cpp(6): error C2079: 'cigar' uses undefined class 'CBox'
    Test.cpp(6): error C2078: too many initializers
    Test.cpp(6): warning C4244: 'initializing' : conversion from 'double'
    to 'int', possible loss of data
    Test.cpp(9): error C2036: 'CBox *' : unknown size
    Test.cpp(9): error C2027: use of undefined type 'CBox'
    Test.cpp(9): error C2228: left of '.Volume' must have
    class/struct/union type
    Test.cpp(11): error C2228: left of '.Volume' must have
    class/struct/union type


    is there a way to make it so that i can keep the files apart, if i
    wanted all my classes to be in a header and the source to be separate,
    please note that i wanted to make the constructors and the Volume
    method inline that's why i put the code in the header.

    Thank you.
     
    soni29, Sep 6, 2003
    #1
    1. Advertising

  2. soni29

    David Guest

    I'm not sure of the file split, but it appears that your
    "source file" didn't include cbox.h. You don't need the
    "class CBox;" statement in the source file.

    David

    On Sat, 6 Sep 2003 14:17:17 UTC, (soni29) wrote:

    > hi,
    > i have written the following code, still in the learning stage:
    > #include<iostream.h>
    >
    > class CBox {
    >
    > public:
    > // Constructor definition
    > CBox(double lv, double bv = 1.0, double hv = 1.0) : m_Length(lv),
    > m_Breadth(bv), m_Height(hv)
    > {
    > cout << endl << "Constructor called";
    > }
    >
    > // Default Constructor
    > CBox() {
    > cout << endl
    > << "Default constructor called.";
    > m_Length = m_Breadth = m_Height = 1.0;
    > }
    >
    > // Function to calculate the volume of a box
    > double Volume() const {
    > return m_Length * m_Breadth * m_Height;
    > }
    >
    > private:
    > double m_Length;
    > double m_Breadth;
    > double m_Height;
    > };
    >
    >
    > int main() {
    > CBox boxes[5];
    > CBox cigar(8.0, 5.0, 1.0);
    >
    > cout << endl
    > << "Volume of boxes[3] = " << boxes[3].Volume()
    > << endl
    > << "Volume of cigar = " <<cigar.Volume();
    >
    > cout << endl;
    > return 0;
    > }
    >
    >
    > when i try to break it into a header and source file, 2 separate
    > files, i get errors:
    > source file:
    > #include <iostream.h>
    > class CBox;
    >
    > int main() {
    > CBox boxes[5];
    > CBox cigar(8.0, 5.0, 1.0);
    >
    > cout << endl
    > << "Volume of boxes[3] = " << boxes[3].Volume()
    > << endl
    > << "Volume of cigar = " <<cigar.Volume();
    >
    > cout << endl;
    > return 0;
    > }
    >
    >
    > CBox.h:
    > #include<iostream.h>
    >
    > class CBox {
    >
    > public:
    > // Constructor definition
    > CBox(double lv, double bv = 1.0, double hv = 1.0) : m_Length(lv),
    > m_Breadth(bv), m_Height(hv)
    > {
    > cout << endl << "Constructor called";
    > }
    >
    > // Default Constructor
    > CBox() {
    > cout << endl
    > << "Default constructor called.";
    > m_Length = m_Breadth = m_Height = 1.0;
    > }
    >
    > // Function to calculate the volume of a box
    > double Volume() const {
    > return m_Length * m_Breadth * m_Height;
    > }
    >
    > private:
    > double m_Length;
    > double m_Breadth;
    > double m_Height;
    > };
    >
    >
    > \Microsoft Visual Studio .NET\Vc7\include\useoldio.h(29): warning
    > C4995: '_OLD_IOSTREAMS_ARE_DEPRECATED': name was marked as #pragma
    > deprecated
    > Test.cpp(5): error C2133: 'boxes' : unknown size
    > Test.cpp(5): error C2512: 'CBox' : no appropriate default constructor
    > available
    > Test.cpp(5): error C2262: 'boxes' : cannot be destroyed
    > Test.cpp(6): error C2079: 'cigar' uses undefined class 'CBox'
    > Test.cpp(6): error C2078: too many initializers
    > Test.cpp(6): warning C4244: 'initializing' : conversion from 'double'
    > to 'int', possible loss of data
    > Test.cpp(9): error C2036: 'CBox *' : unknown size
    > Test.cpp(9): error C2027: use of undefined type 'CBox'
    > Test.cpp(9): error C2228: left of '.Volume' must have
    > class/struct/union type
    > Test.cpp(11): error C2228: left of '.Volume' must have
    > class/struct/union type
    >
    >
    > is there a way to make it so that i can keep the files apart, if i
    > wanted all my classes to be in a header and the source to be separate,
    > please note that i wanted to make the constructors and the Volume
    > method inline that's why i put the code in the header.
    >
    > Thank you.
     
    David, Sep 6, 2003
    #2
    1. Advertising

  3. soni29 wrote in news::

    > when i try to break it into a header and source file, 2 separate
    > files, i get errors:
    > source file:
    > #include <iostream.h>


    #include <iostream> /* for std::cout */
    #include <ostream> /* for std::endl */

    > class CBox;


    // replace with:

    #include "CBox.h"

    >
    > int main() {


    using std::cout; /* so we can write cout instead of std::cout */
    using std::endl; /* ... */

    > CBox boxes[5];
    > CBox cigar(8.0, 5.0, 1.0);
    >
    > cout << endl
    > << "Volume of boxes[3] = " << boxes[3].Volume()
    > << endl
    > << "Volume of cigar = " <<cigar.Volume();
    >
    > cout << endl;
    > return 0;
    > }
    >
    >
    > CBox.h:
    > #include<iostream.h>
    >


    #include <iostream> /* for std::cout */
    #include <ostream> /* for std::endl */


    > class CBox {
    >
    > public:
    > // Constructor definition
    > CBox(double lv, double bv = 1.0, double hv = 1.0) : m_Length(lv),
    > m_Breadth(bv), m_Height(hv)
    > {
    > cout << endl << "Constructor called";


    std::cout << std::endl << "Constructor called";

    > }
    >
    > // Default Constructor
    > CBox() {
    > cout << endl


    std::cout << std::endl


    > << "Default constructor called.";
    > m_Length = m_Breadth = m_Height = 1.0;
    > }
    >
    > // Function to calculate the volume of a box
    > double Volume() const {
    > return m_Length * m_Breadth * m_Height;
    > }
    >
    > private:
    > double m_Length;
    > double m_Breadth;
    > double m_Height;
    > };
    >


    The main bit you were missin was #include "CBox.h".

    But also note that all the C++ specific parts of the standard
    library use includes without the .h suffix, also the types,
    object's and function's they declare are in namespace std,
    hence all "std::" prefixing I did above.


    HTH

    Rob.
    --
    http://www.victim-prime.dsl.pipex.com/
     
    Rob Williscroft, Sep 6, 2003
    #3
  4. David wrote:

    > I'm not sure of the file split,

    <snip>

    Please don't top-post. Re-read section 5 of the FAQ for posting
    guidelines. You could also find this rule in pretty much any netiquette
    reference, including RFC 1855.

    http://www.parashift.com/c -faq-lite/

    -Kevin
    --
    My email address is valid, but changes periodically.
    To contact me please use the address from a recent posting.
     
    Kevin Goodsell, Sep 6, 2003
    #4
  5. soni29

    soni29 Guest

    Thank you.
     
    soni29, Sep 6, 2003
    #5
  6. Rob Williscroft wrote:

    > #include <iostream> /* for std::cout */
    > #include <ostream> /* for std::endl */


    Is that really necessary? According to my "C++ Programming Language: Special
    Edition" p 633: "Manipulators taking istream and ostream are presented in
    <istream> and <ostream>, respectively, and also in <iostream>". std::endl
    is an ostream manipulator.
    Also, since std::cout is an std::eek:stream object, and is defined in
    <iostream>, doesn't it follow that <ostream> has to have been included by
    <iostream>?

    --
    John L. Fjellstad

    A: Top posting!
    Q: What is the most irritating thing on Usenet?
     
    John L Fjellstad, Sep 7, 2003
    #6
  7. John L Fjellstad wrote in news:bdidjb.r0s.ln@192.168.1.1:

    > Rob Williscroft wrote:
    >
    >> #include <iostream> /* for std::cout */
    >> #include <ostream> /* for std::endl */

    >
    > Is that really necessary? According to my "C++ Programming Language:
    > Special Edition" p 633: "Manipulators taking istream and ostream are
    > presented in <istream> and <ostream>, respectively, and also in
    > <iostream>". std::endl is an ostream manipulator.


    Logic's good so far.

    > Also, since std::cout is an std::eek:stream object, and is defined in
    > <iostream>, doesn't it follow that <ostream> has to have been included
    > by <iostream>?
    >


    No <iostream>

    Rob.
    --
    http://www.victim-prime.dsl.pipex.com/
     
    Rob Williscroft, Sep 7, 2003
    #7
  8. John L Fjellstad wrote in news:bdidjb.r0s.ln@192.168.1.1:

    My appologees for the previous post. I clicked send before
    I was finnished.

    > Rob Williscroft wrote:
    >
    >> #include <iostream> /* for std::cout */
    >> #include <ostream> /* for std::endl */

    >
    > Is that really necessary? According to my "C++ Programming Language:
    > Special Edition" p 633: "Manipulators taking istream and ostream are
    > presented in <istream> and <ostream>, respectively, and also in
    > <iostream>". std::endl is an ostream manipulator.


    This is what usually happens, but it isn't what the standard says.
    It's what most people (including me - untill I was told otherwise)
    expect to happen.

    > Also, since std::cout is an std::eek:stream object, and is defined in
    > <iostream>, doesn't it follow that <ostream> has to have been included
    > by <iostream>?
    >


    <iostream> needs to declare the objects cin, cout, cerr etc.
    The simplest way to do that is to:

    #include <istream>
    #include <ostream>

    and then declare:

    namespace std
    {
    extern istream cin;
    extern ostream cout;
    ...
    }

    But it doesen't have to work like that. All it *has* to do is
    include enough of the declaration's of std::basic_istream<> and
    std::basic_ostream<> and possibly the typedef's std::istream and
    std::eek:stream, so that it can declare the cin, cout ... objects.

    It could miss out all the non-inline member defenition's.

    It could also miss out defenition's for the constructor's and
    destructor's for the basic_?stream<>'s even if they are inlined
    as cin etc are magicly constructed before main() is entered and
    aren't destroyed.

    Most importantly, It dosent need to include the declaration and/or
    defenition's for std::endl, std::ends, or std::flush. Firstly
    because the standard dosen't require it too and secondly because
    they aren't required for functioning cin, cout ... objects.

    Rob.
    --
    http://www.victim-prime.dsl.pipex.com/
     
    Rob Williscroft, Sep 7, 2003
    #8
  9. On 07 Sep 2003 08:46:59 GMT, Rob Williscroft <> wrote:

    >John L Fjellstad wrote in news:bdidjb.r0s.ln@192.168.1.1:
    >
    >My appologees for the previous post. I clicked send before
    >I was finnished.
    >
    >> Rob Williscroft wrote:
    >>
    >>> #include <iostream> /* for std::cout */
    >>> #include <ostream> /* for std::endl */

    >>
    >> Is that really necessary? According to my "C++ Programming Language:
    >> Special Edition" p 633: "Manipulators taking istream and ostream are
    >> presented in <istream> and <ostream>, respectively, and also in
    >> <iostream>". std::endl is an ostream manipulator.

    >
    >This is what usually happens, but it isn't what the standard says.
    >It's what most people (including me - untill I was told otherwise)
    >expect to happen.
    >
    >> Also, since std::cout is an std::eek:stream object, and is defined in
    >> <iostream>, doesn't it follow that <ostream> has to have been included
    >> by <iostream>?
    >>

    >
    ><iostream> needs to declare the objects cin, cout, cerr etc.
    >The simplest way to do that is to:
    >
    >#include <istream>
    >#include <ostream>
    >
    >and then declare:
    >
    >namespace std
    >{
    > extern istream cin;
    > extern ostream cout;
    > ...
    >}
    >
    >But it doesen't have to work like that. All it *has* to do is
    >include enough of the declaration's of std::basic_istream<> and
    >std::basic_ostream<> and possibly the typedef's std::istream and
    >std::eek:stream, so that it can declare the cin, cout ... objects.
    >
    >It could miss out all the non-inline member defenition's.
    >
    >It could also miss out defenition's for the constructor's and
    >destructor's for the basic_?stream<>'s even if they are inlined
    >as cin etc are magicly constructed before main() is entered and
    >aren't destroyed.
    >
    >Most importantly, It dosent need to include the declaration and/or
    >defenition's for std::endl, std::ends, or std::flush. Firstly
    >because the standard dosen't require it too and secondly because
    >they aren't required for functioning cin, cout ... objects.


    I was simply amazed the first time I heard of this.

    But it's not like it is an argument that virtually _all_ C++ textbooks,
    including TCPPPL, are incorrect.

    It's simply an argument that the standard has an oversight, in addition
    to numerous other oversights.

    We should not teach newbies to include more than <iostream> in order to
    use std::cout and std::endl.

    Instead, point out (if necessary) that they might run into people who
    incorrectly think that the common practice is incorrect.
     
    Alf P. Steinbach, Sep 7, 2003
    #9
  10. On 07 Sep 2003 13:06:29 GMT, Rob Williscroft <> wrote:

    >> Instead, point out (if necessary) that they might run into people who
    >> incorrectly think that the common practice is incorrect.
    >>

    >
    >I agree (kind off) but where do you draw the line. std::endl in
    ><iostream> std::make_pair in <map> or maybe:
    >
    >((some_class_type)0)->some_non_virtual_member();


    Some cases are not clear-cut.

    Some are clearly against current practice.

    The case for <iostream> is, otoh., very simple and clear: there's not
    one C++ book that I know of that includes <ostream> to get std::endl.
     
    Alf P. Steinbach, Sep 7, 2003
    #10
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mark Goldin

    Errors, errors, errors

    Mark Goldin, Jan 17, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    967
    Mark Goldin
    Jan 17, 2004
  2. Newsgroup - Ann
    Replies:
    4
    Views:
    716
    lilburne
    Nov 2, 2003
  3. J.Ram
    Replies:
    7
    Views:
    654
  4. mlt
    Replies:
    2
    Views:
    853
    Jean-Marc Bourguet
    Jan 31, 2009
  5. Michael Tan
    Replies:
    32
    Views:
    997
    Ara.T.Howard
    Jul 21, 2005
Loading...

Share This Page