繁体   English   中英

Eclipse(C ++)的未定义参考错误

[英]Undefined reference error with Eclipse (C++)

我一直在学习C ++,并且一直在使用一些测试代码来调试更大项目的片段。 我试图使用另一个文件中的对象,但是尽管包含了适当的头文件,但我仍然收到未定义的引用错误。 我在Linux上将Eclipse与C ++ CDT一起使用。 该代码如下所示:

丙型肝炎

class A {

   private:

      int i;
      int j;

   public:

      A(int i1, int i2) {
         i = i1;
         j = i2;
      }

      int sum() {
         return (i+j);          
      }
};

#ifndef A_H_
#define A_H_

class A {
   public:
      A(int i1, int i2);
      int sum();
};
#endif

main.cpp

#include <iostream>
#include "a.h"

int main() {
   A a(1,2); //undefined reference to 'A::A(int,int)'
   std::cout << a.sum(); //undefined reference to 'A::sum(void)'
   return 0;
}

这是我的语法问题,还是我需要在编译器中深入研究?

问题是main.cpp在标头ah中仅看到类的定义,而头ah不包含构造函数和成员函数的定义。

A.cpp中定义了这些函数,但默认情况下将它们定义为内联函数。 因此main.cpp再次看不到它们的定义。

考虑到根据C ++标准(3.2一个定义规则)

6一个类类型(第9章),枚举类型(7.2),具有外部链接的内联函数(7.1.2),类模板(第14章),非静态函数模板(14.5.6)可以有多个定义。 ),类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1)或在程序中未指定某些模板参数(14.7、14.5.5)的模板专门化,每个定义出现在不同的翻译单元中,并提供满足以下要求的定义。 给定这样一个在多个翻译单元中定义的名为D的实体,则

(6.1)— D的每个定义应由相同的令牌序列组成

所以在A.cpp中,您应该写

#include "a.h"


  A::A(int i1, int i2) {
     i = i1;
     j = i2;
  }

  int A::sum() {
     return (i+j);          
  }

类定义也应以分号结尾。

这不是在C ++中拆分类的公共接口和私有实现的方式。

为了使该代码在主编译

   A a(1,2);

编译器需要已经知道A的大小-这是因为即使在其他地方定义了调用它的构造函数,该存储也是在本地分配的。

您可以通过使用指针(最好是智能指针)或pimpl习惯用法来避免这种耦合,但这是默认设置。

这意味着标头中类的定义必须为

class A {
    int i;
    int j;

public:
    A(int i1, int i2);
    int sum();
};

(请注意,在类定义的末尾使用' ,这很重要-您还需要确保以#endif终止了包含卫士)。

然后,实现cpp文件应如下所示:

#include "a.h"

A::A(int i1, int i2) : i(i1), j(i2)
{
}

int A::sum()
{
  return (i+j);          
}

您只能定义一次A ,因此您在标头和实现文件中不能有其他定义。

现在,这些问题已得到解决:如果您的原始错误仍然存​​在,则残留的问题可能与编译/链接设置有关。

每个人都在谈论定义的东西是真的。 但是,还有其他一些问题:

  • 你需要分号; 类定义的大括号后
  • 您需要在#ifndef之后使用#endif指令(通常位于头文件的末尾)
  • 即使使用#include <iostream>cout也不会导出到顶级名称空间。 您必须将其称为std::cout

这是一个完整的工作示例。 这是一个文件,但是如果您愿意,可以自己将其拆分:

#ifndef A_H_
#define A_H_

class A {
   private:

      int i;
      int j;

   public:
      A(int i1, int i2);
      int sum();
};
#endif

A::A(int i1, int i2) {
    i = i1;
    j = i2;
}

int A::sum() {
    return (i+j);          
}

#include <iostream>

int main() {
   A a(1,2);
   std::cout << a.sum();
   return 0;
}

自己在线尝试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM