I tried a naive class taken from a book I found in the office.
This is it:
#include <iostream.h>
#include <math.h>
const double ANG_RAD = 0.017;
class Angulo {
double valor;
public:
void act_valor( double );
double seno( void );
double coseno( void );
double tangente( void );
} grado;
void Angulo::act_valor( double a ) {
valor = a;
}
double Angulo::seno(void)
{
double temp;
temp = sin( ANG_RAD * this.valor );
return( temp );
}
double Angulo::coseno(void)
{
double temp;
temp = cos(ANG_RAD * valor );
return (temp);
}
double Angulo::tangente(void)
{
return ANG_RAD * valor;开发者_开发问答
}
main()
{
grado.act_valor( 60.0 );
cout << "El seno del angulo es "
<< grado.seno() << "\n";
return(0);
}
I compiled and this is the error message I've got ( I understand now why people complain about C++ )
In file included from /usr/include/c++/4.2.1/backward/iostream.h:31,
from Angulo.cc:1:
/usr/include/c++/4.2.1/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
Undefined symbols:
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in ccg0526i.o
_main in ccg0526i.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccg0526i.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const", referenced from:
std::__verify_grouping(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in ccg0526i.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long) const", referenced from:
std::__verify_grouping(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in ccg0526i.o
std::__verify_grouping(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in ccg0526i.o
std::__verify_grouping(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in ccg0526i.o
"___gxx_personality_v0", referenced from:
Angulo::act_valor(double)in ccg0526i.o
Angulo::tangente() in ccg0526i.o
std::__verify_grouping(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)in ccg0526i.o
___tcf_0 in ccg0526i.o
Angulo::cosen() in ccg0526i.o
Angulo::seno() in ccg0526i.o
_main in ccg0526i.o
unsigned long const& std::min<unsigned long>(unsigned long const&, unsigned long const&)in ccg0526i.o
__static_initialization_and_destruction_0(int, int)in ccg0526i.o
global constructors keyed to gradoin ccg0526i.o
CIE in ccg0526i.o
"std::ios_base::Init::~Init()", referenced from:
___tcf_0 in ccg0526i.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from:
_main in ccg0526i.o
"std::cout", referenced from:
_main in ccg0526i.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Could somebody tell me what's going on?
My compiler:
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5664~38/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5664)
I double and triple check the source in this old book and it is the same.
Thanks.
Your book is outdated. The compiler you are using is much more modern, so it is simply refusing to translate the old non-standard code. It is quite possible that you can whip it into working somehow, but it would make more sense to update the code to make it standard C++. In general the code looks OK, only a few changes are necessary.
The header that you are supposed to use is <iostream>
, not <iostream.h>
. The compiler told you about it already. Also, the components of standard library are now in namespace std
, so the output line in main
should look as follows
std::cout << "El seno del angulo es " << grado.seno() << "\n";
main
function must declare explicit return type
int main()
{
C++ language does not imply int
by default as C did.
As additional, less important remarks, there's no need to declare parameter-less functions as (void)
in C++. A mere ()
has exactly the same effect. Although if you like (void)
better, it will work as well. Also, there's no need to take the argument of return
in ()
. You can just say return 0;
. It is also strange to see the inconsistent returns
- some with ()
and some without ()
. Was it that way in the book?
Fixed source:
#include <iostream>
#include <math.h>
const double ANG_RAD = 0.017;
class Angulo {
double valor;
public:
void act_valor( double );
double seno( void );
double coseno( void );
double tangente( void );
} grado;
void Angulo::act_valor( double a ) {
valor = a;
}
double Angulo::seno(void)
{
double temp;
temp = sin( ANG_RAD * valor );
return( temp );
}
double Angulo::coseno(void)
{
double temp;
temp = cos(ANG_RAD * valor );
return (temp);
}
double Angulo::tangente(void)
{
return ANG_RAD * valor;
}
main()
{
grado.act_valor( 60.0 );
std::cout << "El seno del angulo es "
<< grado.seno() << "\n";
return(0);
}
Compiling: g++ prog.cc -o prog
Well that code definitely has some problems. First, it's including <iostream.h>
but these days it should be <iostream>
(unless your compiler is as old as the book.)
Secondly the grado object is a static for no good reason which is only going to confuse everybody.
And third, the code for tangente()
just returns the angle in radians, not the tangent.
What are you trying to learn to do? I have a feeling that book isn't going to take you where you need to be.
精彩评论