2

全部

我敢打赌,这是一个经常被问到的问题。但每次都在不同的背景下提出。这是我的问题:我在 VS2012 Express 中有一个项目。该项目包括几个头文件。把整个项目贴在这里是没有意义的,所以我只是给出一个简单的结构。

在头文件 Header.h 中,我有一个父类 Sim,其定义如下:

class Sim
{
    protected:
    // some member data
    public:
       Sim(int x, int y, A a);
       vector<int> return_parameters(A a);  // problems happen at this function
       // class A is defined in another header file and properly included here
       // function return_parameters has no definition, thus is an abstract function
}

Sim::Sim(int x, int y, A a)
{// some operations}

然后我有从 Sim 派生的公共类 Sim_son

  class Sim_son: public Sim
  {
      private:
        // some member data
      public:
        Sim_son(int x, int y, A a, int z);
        vector<int> return_parameters(A a);  
   };

  Sim_son::Sim_son(int x, int y, A a, int z): Sim(x,y, a)
  {
     // some operations
  }

  vector<int> Sim_son::return_parameters(A a)
  {
     return a.someData;
  }

在 main() 中,我的代码如下:

  void main()
  {
     // some operations
     Sim_son Obj_son(x, y, a, z);
     Obj_son.return_parameters(a)    //PROBLEM HAPPENS
  }

编译器给出一个LNK2019 错误,表示函数 Sim_son::Sim_son(void) 中引用的未解析的外部符号 Sim::return_parameters。

我评论了“Obj_son.return_parameters(a)”这一行,然后错误消失了。所以我想这就是麻烦的根源。

谁能帮我解决这个问题?提前谢谢了。

最好的问候龙

4

2 回答 2

0

在 class 的声明中Sim,您告诉编译器您有一个名为 的函数return_parameters,但您没有给它一个实现,因此Sim::return_parameters不会生成 的目标代码。只要你不调用这个函数就可以了,因为它的目标代码不是必需的。但是当你调用它时,链接器需要它的目标代码并且找不到它,所以它给出了一个错误。

发生这种情况是因为您没有告诉编译器这return_parameters是一个虚函数。尝试:

class Sim
{
    protected:
    // some member data
    public:
       Sim(int x, int y, A a);
       virtual vector<int> return_parameters(A a) = 0;
}

这将产生return_parameters一个纯虚函数,因此无法生成 Sim 的实例。

或者如果你不想Sim成为一个抽象类,你可以标记return_parametersvirtual并为其提供一个默认实现。像这样:

class Sim
{
    protected:
    // some member data
    public:
       Sim(int x, int y, A a);
       virtual vector<int> return_parameters(A a)
       {
           return vector<int>();
       }
}

问题是不提供函数体不会使函数成为虚拟函数。因此,提供了关键字virtual:)

在我看来,您需要对虚拟功能进行更多培训。看看这个链接:C++ Polymorphism

于 2013-07-30T11:34:54.123 回答
0

首先,你的主要应该看起来像

int main() {
    return 0;
}

其次,你有;下面的陈述吗?

Obj_son.return_parameters(a)

此外,您的“Sim”类需要以;.

于 2013-07-30T11:26:57.537 回答