473,378 Members | 1,175 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,378 software developers and data experts.

errors result when creating header file - visual c++

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.
Jul 19 '05 #1
9 5523
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, so****@hotmail.com (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.

Jul 19 '05 #2
soni29 wrote in news:ca**************************@posting.google.c om:
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/
Jul 19 '05 #3
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.

Jul 19 '05 #4
Thank you.
Jul 19 '05 #5
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::ostream 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?
Jul 19 '05 #6
John L Fjellstad wrote in news:bd***********@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::ostream 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/
Jul 19 '05 #7
John L Fjellstad wrote in news:bd***********@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::ostream 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::ostream, 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/
Jul 19 '05 #8
On 07 Sep 2003 08:46:59 GMT, Rob Williscroft <rt*@freenet.REMOVE.co.uk> wrote:
John L Fjellstad wrote in news:bd***********@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::ostream 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::ostream, 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.

Jul 19 '05 #9
On 07 Sep 2003 13:06:29 GMT, Rob Williscroft <rt*@freenet.REMOVE.co.uk> 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.

Jul 19 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Hafeez | last post by:
I am having real trouble compiling this code http://www.cs.wisc.edu/~vganti/birchcode/codeHier/AttrProj.tgz The attachment shows errors when compiled using the current version of g++ in a...
12
by: Russ | last post by:
Hello. My new dev machine is running XP Pro. In the past all equipment has only used Windows 2000. I have had a lot of problems getting my projects up and running on the new machine. The current...
24
by: Massimo Soricetti | last post by:
Hello, I'm not a C newbie, but I'm teaching C programming (well... FIRST programming and then C) to other guys these days and it's driving me to some reflexions on the language. It's not...
0
by: Krishnan | last post by:
Hi I am trying to build a small client-server program using OpenSSL functions. I get errors on trying to build the program using Visual Studio .Net (Visual C++ 7.0). I am new to Visual Studio...
2
by: jen_designs | last post by:
I am trying to create a template in dot net. All the articles I have read on the net are rather confusing. I need a simple solution to create a header and a footer on each page. Can someone...
1
by: Givisi | last post by:
Hello all! I am a completly newbie at C and I dont have good basis from Java so I cant get the linked lists part from C. I am trying to run the code from the function that is written at the end of...
14
by: Martin Wells | last post by:
When I have errors in a program, whether they be compiler errors, linker errors, or if the program crashes when running, I have a list of things I check for initially. If I get an error for...
4
by: rhivka | last post by:
I'm going to try to keep this question within the student posting guidelines. I've been working on a class file, and I'm not sure I've constructed it correctly. I'm getting several errors concerning...
4
by: Dan | last post by:
Hi All, I've got a problem with my C++ application that calls a Java class that I've built with GCJ, I can't run it because I get errors: multiple definition of `atexit' first defined here...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.