ошибка LNK2001: неразрешенный внешний символ — при создании абстрактного класса Stack Overflow

UrzadzenieElektroniczne — мой абстрактный класс, и класс Komputer наследует от него. Я все еще получаю ошибки. Я пытался их исправить, но ни одно из найденных в интернете решений не помогло. Есть ли проблема с определением и объявлением моей виртуальной функции или я должен искать ошибку где-то еще ?:
Ошибки:

     1>CKomputer.obj : error LNK2001: unresolved external symbol "public: virtual void__thiscall Komputer::wlaczenieurz(void)" (?wlaczenieurz@Komputer@@UAEXXZ)
#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;
};
#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();
#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;
}

0

Решение

Ваша функция должна быть квалифицирована как член Komputer:

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

Другие решения

Это опечатка. 🙂

void UrzadzenieElektroniczne::wlaczenieurz()

должно быть:

void Komputer::wlaczenieurz()
3

Вам нужно определить void UrzadzenieElektroniczne::wlaczenieurz() вместо void Komputer::wlaczenieurz(), Сложность в том, что C ++ на самом деле позволяет иметь определения чисто виртальных функций. Через них могут быть доступны только не виртуальные звонки.
Ваш код объявляет 2 wlaczenieurz() один в базовом классе, и он чисто виртуальный, поэтому его не нужно определять, а другой в производном классе, который должен есть определение.
Хотя в вашем случае это явно опечатка, в общем случае вы можете иметь некоторую реализацию по умолчанию чистой виртуальной функции, которую можно использовать в производном классе, добавив using заявление.
Например в вашем случае using UrzadzenieElektroniczne::wlaczenieurz; в Komputer вместо wlaczenieurz объявление также должно исправить ошибку.

1
По вопросам рекламы [email protected]