【问题标题】:C++: error LNK: unresolved external symbol, resulting from virtual functionsC++:错误 LNK:未解析的外部符号,由虚函数产生
【发布时间】:2013-02-22 19:00:56
【问题描述】:

我的界面的类等概览!

Animal.H:

class Animal
{
public:
   virtual void walk();
}

Animals.CPP

=空

牛.H:

class Cow : public Animal
{
public:
   virtual void walk();
}

这里它应该异常地知道函数 walk 是从它派生的类中获取的,对吧? (例如Animal..)当它没有定义函数walk时,它应该说我应该定义它对...?

Cow.CPP:

void Cow::walk()
{
   //do something specific for cow
}

SomeOtherClass.H

namespace SomeNamespace
{
   void LetAnimalWalk();
}

SomeOtherClass.CPP

Cow myCow;
namespace SomeNamespace
{
   void LetAnimalWalk()
   {
      myCow.walk();
   }
}

这应该可以正常工作吗?...我的意思是命名空间,“Class::...”的东西?以及我继承和使用接口的方式?

因为这样我得到了我从接口创建的每个函数,所以每个虚函数都会给我以下错误:

SomeOtherClass.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Cow::Walk (...etc etc...) referenced in function "void __cdecl SomeNamespace::LetAnimalWalk() (...etc etc...)

有谁知道我做错了什么,我发现的主要是这意味着我没有正确声明一个函数(在 Cow.cpp 中的某个地方??)

提前谢谢大家

【问题讨论】:

    标签: c++ interface virtual lnk2019


    【解决方案1】:
    class Animal
    {
    public:
       virtual void walk();
    }
    

    您需要定义该函数或使其成为纯虚拟函数。

    【讨论】:

    • 但它是虚拟的吧?所以当我做一个 Cow::walk.. 我定义它.. 或?
    • 如果基类函数不是纯虚函数,你也需要在 Animal 类中定义它。如果它在 Animal 中是纯虚拟的,你只需要在 Cow 中定义它。此外,虚函数通常与指向基类的指针一起使用,即Animal* animal = new Cow(); animal->walk();,它将调用牛类中的 walk 函数。
    • 嗯,我现在也试过了..!那样用肯定更好,但还是会出现同样的错误......
    • 那么你的代码应该可以工作了,尝试发布重现问题的整个项目,以便我们查看它。
    • 我的坏巴里斯,你的解决方案 "Animal* animal = new Cow(); animal->walk();"我试过..但在错误的班级..因为我在2个班级有过,所以现在我试了一下!就是这样!感谢您的帮助
    【解决方案2】:

    当您有一个不想在基类中定义的虚函数时,您需要将其抽象化,这可以使用以下语法完成:

    class Animal
    {
    public:
       virtual void walk() = 0;
    }
    

    没有这个如果没有定义你会得到一个错误,如果没有任何派生类没有定义它你会得到一个错误。

    【讨论】:

    • 啊,我的错,我什至有那个......!所以它已经是纯虚拟的了..但仍然有同样的错误!
    【解决方案3】:

    要么使基类中的函数成为纯虚拟函数:

    class Animal
    {
        public:
            virtual void walk() = 0;
    }
    

    或定义一个简单的实现:

    void Animal::walk()
    {
       return;    // could also throw an exception here
    }
    

    【讨论】:

    • 我什至像你说的那样定义了它,这个微不足道的实现(我把它变成了纯虚拟的,我定义了实现,我同时做了两个......但我的错误仍然是一样的跨度>
    • 是的,我看到你修改了问题,抱歉。您的代码显然已简化,因此我假设您已准备好所有缺少的 #include 指令(否则您应该在链接阶段之前收到错误消息)。你用的是什么开发平台?您确定 Cow.cpp 是您的项目或 makefile 的一部分吗?
    • 我正在使用 VS2012 ......事实上,包括我确实没有在问题中提出!嗯,就我所见,Cow.cpp 是解决方案的一部分.. 我会去检查确实是的,我的 VS2012,只是说它包含在项目中......! :\
    【解决方案4】:

    动物* 动物 = 新牛();动物->walk();

    Cow myCow 显然不起作用!

    【讨论】:

    • Cow 对象上直接调用walk() 实际上应该可以工作(不会给出链接器错误)。您通常通过指针调用虚函数的原因是为了确保它实际上是被虚拟调用的(我在ideone.com/UteSxT 上写了一个快速示例)。这解决了您的问题的事实告诉我还有其他事情发生。
    猜你喜欢
    • 2012-05-22
    • 2019-02-26
    • 2013-02-20
    • 2018-11-19
    • 1970-01-01
    • 2012-09-04
    • 2013-05-02
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多