2013-04-25 2 views
0

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

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

CKomputer.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(); 

CKomputer.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; 
} 

ответ

2

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

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

Но я хочу, чтобы 'wlaczenieurz()' была виртуальной функцией класса UrzadzenieElektroniczne'. – fragon

+0

Вы объявили его чистой виртуальной функцией в 'UrzadzenieElektroniczne'. Это означает, что он должен быть реализован производными классами. Поскольку 'Komputer' является производным классом, он должен реализовать эту функцию. –

+0

Ок. Это была моя ошибка. Я думал, что абстрактный класс должен реализовать виртуальную функцию. Теперь он работает нормально. Благодаря! – fragon

3

Это опечатка. :)

void UrzadzenieElektroniczne::wlaczenieurz() 

должно быть:

void Komputer::wlaczenieurz() 
1

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

+0

Но я определяю 'void UrzadzenieElektroniczne :: wlaczenieurz()', как вы можете видеть в моем коде, и это не работает. Когда я определил 'Komputer :: wlaczenieurz()' он работает, но я не понимаю, является ли он по-прежнему виртуальной функцией класса UrzadzenieElektroniczne' – fragon

+0

. Да, это по-прежнему виртуальная функция 'UrzadzenieElektroniczne', реализованная' Komputer'. Вам не нужно (через разрешено) определить 'UrzadzenieElektroniczne :: wlaczenieurz()' ответственность производного класса за реализацию чистых виртуальных функций; – alexrider

Смежные вопросы