【问题标题】:error LNK2001: unresolved external symbol - when creating abstract class c++错误 LNK2001:未解析的外部符号 - 创建抽象类 C++ 时
【发布时间】:2013-04-25 21:44:41
【问题描述】:

UrzadzenieElektroniczne 是我的抽象类,并且 Komputer 类继承自它。我仍然得到错误。我试图修复它们,但我在互联网上找到的所有解决方案都不起作用。我的虚函数的定义和声明是否有问题,或者我应该在其他地方查找错误?: 错误:

     1>CKomputer.obj : error LNK2001: unresolved external symbol "public: virtual void__thiscall Komputer::wlaczenieurz(void)" (?wlaczenieurz@Komputer@@UAEXXZ)

UrzadzenieElektroniczne.h

#pragma once

#include <stdlib.h>
#include <iostream>
#include <string>

using namespace std;

class UrzadzenieElektroniczne
{
public:
int czy_wlaczony;
UrzadzenieElektroniczne();
~UrzadzenieElektroniczne();
virtual void wlaczenieurz() = 0;
private:

protected:
string producent;
};

CKComputer.h

#pragma once

#include <stdlib.h>
#include <iostream>
#include <string>

#include "UrzadzenieElektroniczne.h"
#include "Procesor.h"
#include "KartaDzwiekowa.h"


using namespace std;

class Komputer: public UrzadzenieElektroniczne
{
private:
Procesor procesor;
KartaDzwiekowa *karta_dzwiekowa;

string nazwa_komputera;
int ram;
int ile_kart_dzwiekowych;
public:

void wlaczenieurz();

CKComputer.cpp

#include <iostream>
#include <cstdio>
#include <string>


#include "CKomputer.h"
#include "Procesor.h"
#include "KartaDzwiekowa.h"

void UrzadzenieElektroniczne::wlaczenieurz()
{
if (czy_wlaczony == 0)
    cout<<"Komputer wylaczony"<<endl;
if (czy_wlaczony == 1)
    cout<<"Komputer wlaczony"<<endl;
}

【问题讨论】:

    标签: c++ class inheritance abstract lnk2001


    【解决方案1】:

    这是一个错字。 :)

    void UrzadzenieElektroniczne::wlaczenieurz()
    

    应该是:

    void Komputer::wlaczenieurz()
    

    【讨论】:

      【解决方案2】:

      您的函数可能应该被限定为Komputer 的成员:

      void Komputer::wlaczenieurz()
      //   ^^^^^^^^
      {
      if (czy_wlaczony == 0)
          cout<<"Komputer wylaczony"<<endl;
      if (czy_wlaczony == 1)
          cout<<"Komputer wlaczony"<<endl;
      }
      

      【讨论】:

      • 但我希望 wlaczenieurz() 成为 class UrzadzenieElektroniczne 的虚函数。
      • 您已在UrzadzenieElektroniczne 中将其声明为纯虚函数。这意味着它必须由派生类实现。由于Komputer是派生类,所以必须实现这个功能。
      • 好的。那是我的错误。我认为抽象类必须实现虚函数。现在它工作正常。谢谢!
      【解决方案3】:

      您需要定义void UrzadzenieElektroniczne::wlaczenieurz() 而不是void Komputer::wlaczenieurz()。棘手的部分是 C++ 实际上允许定义纯虚函数。通过它们只能通过非虚拟调用访问。
      您的代码在基类中声明了 2 wlaczenieurz() 一个,它是纯虚拟的,因此不需要定义,而一个在派生类中必须有定义。
      虽然在您的情况下显然是打印错误,但通常您可能有一些纯虚函数的默认实现,可以通过添加 using 语句在派生类中使用。
      例如,在您的情况下,Komputer 中的 using UrzadzenieElektroniczne::wlaczenieurz; 而不是 wlaczenieurz 声明也应该修复错误。

      【讨论】:

      • 但是我定义了void UrzadzenieElektroniczne::wlaczenieurz(),正如您在我的代码中看到的那样,它不起作用。当我定义Komputer::wlaczenieurz()时,它可以工作,但我不明白它是否仍然是class UrzadzenieElektroniczne的虚函数
      • 是的,它仍然是由Komputer 实现的UrzadzenieElektroniczne 的虚函数。您不需要(通过允许)定义UrzadzenieElektroniczne::wlaczenieurz(),实现纯虚函数是派生类的责任;
      猜你喜欢
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2014-09-27
      • 2018-08-14
      • 2018-08-24
      相关资源
      最近更新 更多