【问题标题】:undefined reference to 'vtable for classname' [duplicate]未定义对“类名的vtable”的引用[重复]
【发布时间】:2011-11-12 03:39:40
【问题描述】:

可能重复:
Undefined reference to vtable

我在文件中有一个学生类 - student.h 这是它的构造函数:

class Student
{
protected:
  double _id;
  double _salary;
  double _grade_average;

public:
    Student(double id, double salary,double average):
        _id(id),_salary(salary),_grade_average(average)
    {}
};

然后我得到错误:

对“学生的vtable”的未定义引用

有什么问题?

这是一个 University.h 文件:

 #include "Student.h"
class University : public Student
{
public:
  virtual double getValue();
  University(char university_id,double id, double average,double salary):
    _university_id(university_id),Student(id,average,salary)
  {
  }

private:
  char _university_id;
  static double how_many;
  static double sum_avg_grades;
};

【问题讨论】:

  • 请贴出真实的代码来说明问题
  • 而且它可能是未d定义的,而不是未r定义的。
  • 你是如何在你的代码中使用这个类的?
  • 是的,其他文件是继承它的头文件,以及它们的实现
  • 使用g++,而不是gcc 进行链接...

标签: c++ linker-errors


【解决方案1】:

几件事。

  1. 在变量名后面加上下划线。作为开头的名字 编译器可以使用下划线。
  2. 如果您打算定义至少一个虚函数 从它继承或使用 RTTI。 (例如虚拟析构函数)
  3. 确保每个声明的函数都有对应的 实施。

【讨论】:

  • “不要使用下划线开头的变量名”仅适用于全局变量。
  • 好的,问题解决了。我有一个没有实现的虚函数,所以我将它修复为 virtual double getValue() =0;
  • @Seth Carnegie 虽然这是真的,但以下划线和大写字母开头的变量或带有双下划线 (__var) 的变量在任何地方都保留,因此最好不要以变量名开头下划线。
  • @RTS 正如您自己所说,保留以下划线 大写字母开头的变量。我自己更喜欢用尾随下划线命名私有变量,但前导下划线也很常见,我不认为它违反任何准则。毕竟,C++ 是区分大小写的。
猜你喜欢
  • 2015-09-24
  • 2011-07-27
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
相关资源
最近更新 更多