Мой первый класс C ++ (и ошибка) - PullRequest
1 голос
/ 04 сентября 2010

Я попробовал наивный класс, взятый из книги, которую нашел в офисе.

Вот оно:

#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);
}

Я скомпилировал это сообщение об ошибке (теперь я понимаю, почему люди жалуются на 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

Может кто-нибудь сказать мне, что происходит?

Мой компилятор:

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)

Я дважды проверяю источник в этой старой книге, и он один и тот же.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 04 сентября 2010

Ваша книга устарела.Компилятор, который вы используете, гораздо более современный, поэтому он просто отказывается переводить старый нестандартный код.Вполне возможно, что вы можете каким-то образом заставить его работать, но было бы более разумно обновить код, чтобы сделать его стандартным C ++.В целом, код выглядит хорошо, необходимы только несколько изменений.

Заголовок, который вы должны использовать, - <iostream>, а не <iostream.h>.Об этом вам уже рассказал компилятор.Также компоненты стандартной библиотеки теперь находятся в пространстве имен std, поэтому строка вывода в main должна выглядеть следующим образом:

std::cout << "El seno del angulo es " << grado.seno() << "\n";

main функция должна объявить явный тип возврата

int main()
{

Язык C ++ по умолчанию не подразумевает int, как это делал C.

В качестве дополнительных, менее важных замечаний нет необходимости объявлять функции без параметров как (void) в C ++.Простой () имеет точно такой же эффект.Хотя, если вам нравится (void) лучше, он тоже будет работать.Кроме того, нет необходимости принимать аргумент return в ().Вы можете просто сказать return 0;.Также странно видеть несогласованность returns - некоторые с (), а некоторые без ().Это было так в книге?

2 голосов
/ 04 сентября 2010

Фиксированный источник:

#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);
}

Компиляция: g ++ prog.cc -o prog

1 голос
/ 04 сентября 2010

Ну, этот код определенно имеет некоторые проблемы. Во-первых, он включает <iostream.h>, но в наши дни он должен быть <iostream> (если только ваш компилятор не старше книги).

Во-вторых, объект grado является статичным без всякой веской причины, который только смущает всех.

И в-третьих, код для tangente() просто возвращает угол в радианах, а не тангенс.

Чему ты пытаешься научиться? У меня такое чувство, что книга не приведет тебя туда, куда тебе нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...