代码之家  ›  专栏  ›  技术社区  ›  OscarRyz

我的第一个C++类(和错误)

  •  1
  • OscarRyz  · 技术社区  · 15 年前

    我试过从办公室里找到的一本书中摘取的天真的课程。

    #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 回复  |  直到 15 年前
        1
  •  2
  •   Vadim Shender    15 年前

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

    编译:

        2
  •  5
  •   AnT stands with Russia    15 年前

    你应该使用的标题是 <iostream> ,不是 <iostream.h> std main 应如下所示

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

    主要的 函数必须声明显式返回类型

    int main()
    {
    

    C++语言并不意味着 int 默认情况下,就像C一样。

    (void) 在C++中。仅仅 () (无效) 更好的是,它也会起作用。而且,没有必要接受 return 在里面 () return 0; . 同样奇怪的是,这种不一致性 returns -有些是 () () . 书上是这样写的吗?

        3
  •  1
  •   Kate Gregory    15 年前

    <iostream.h> 但现在应该是这样 <iostream> (除非你的编译器和这本书一样老。)

    第二,grado对象是一个静态的,没有什么好的理由,这只会让每个人感到困惑。

    第三,密码 tangente()

    你想学什么?我觉得这本书不会带你去你想去的地方。

    推荐文章