Mam pewne problemy z wdrażaniem czystych wirtualnych funkcji odziedziczonych po jakiejś abstrakcyjnej klasie, gdy klasy są podzielone na *.h
i *.cpp files
. Kompilator (g++
) mówi mi, że klasa pochodna nie może być utworzona z powodu istnienia czystych funkcji.C++ implementacja czystych funkcji wirtualnych i plików nagłówkowych
/** interface.h**/
namespace ns
{
class Interface {
public:
virtual void method()=0;
}
}
/** interface.cpp**/
namespace ns
{
//Interface::method()() //not implemented here
}
/** derived.h **/
namespace ns
{
class Derived : public Interface {
//note - see below
}
}
/** derived.cpp **/
namespace ns
{
void Derived::Interface::method() { /*doSomething*/ }
}
/** main.cpp **/
using namespace ns;
int main()
{
Interface* instance = new Derived; //compiler error
}
Czy to oznacza, że muszę zadeklarować metodę() dwukrotnie - w interfejsie użytkownika *.h
aw derived.h
też? Czy nie ma innej drogi?
To nie jest prawidłowe C++. 'public void method() = 0;' bardziej przypomina Java. –
Po pierwsze, nie ma powodu, aby mieć plik .cpp, w którym jedyną rzeczą jest pusta przestrzeń nazw. Nie potrzebujesz pliku implementacji dla nagłówka zawierającego klasę abstrakcyjną. – Falmarri
@Falmarri jest poprawna. –