ПРЕДИСЛОВИЕ: я относительно неопытен в C ++, так что это вполне может быть вопрос первого дня.
Я работаю над тем, чья долгосрочная цель заключается в переносимости между несколькими операционными системами. У меня есть следующие файлы:
Utilities.h
#include <string>
class Utilities
{
public:
Utilities() { };
virtual ~Utilities() { };
virtual std::string ParseString(std::string const& RawString) = 0;
};
UtilitiesWin.h (для класса / реализации Windows)
#include <string>
#include "Utilities.h"
class UtilitiesWin : public Utilities
{
public:
UtilitiesWin() { };
virtual ~UtilitiesWin() { };
virtual std::string ParseString(std::string const& RawString);
};
UtilitiesWin.cpp
#include <string>
#include "UtilitiesWin.h"
std::string UtilitiesWin::ParseString(std::string const& RawString)
{
// Magic happens here!
// I'll put in a line of code to make it seem valid
return "";
}
Так что в другом месте моего кода у меня есть это
#include <string>
#include "Utilities.h"
void SomeProgram::SomeMethod()
{
Utilities *u = new Utilities();
StringData = u->ParseString(StringData); // StringData defined elsewhere
}
Компилятор (Visual Studio 2008) умирает от объявления экземпляра
c:\somepath\somecode.cpp(3) : error C2259: 'Utilities' : cannot instantiate abstract class
due to following members:
'std::string Utilities::ParseString(const std::string &)' : is abstract
c:\somepath\utilities.h(9) : see declaration of 'Utilities::ParseString'
Поэтому в данном случае я хочу использовать абстрактный класс (Utilities) как интерфейс и попросить его перейти к реализованной версии (UtilitiesWin).
Очевидно, что я делаю что-то не так, но я не уверен, что. Когда я пишу это, мне приходит в голову, что между реализацией UtilitiesWin абстрактного класса Utilities, которую я пропустил, вероятно, есть важная связь, но я не уверен, где. Я имею в виду следующие работы
#include <string>
#include "UtilitiesWin.h"
void SomeProgram::SomeMethod()
{
Utilities *u = new UtilitiesWin();
StringData = u->ParseString(StringData); // StringData defined elsewhere
}
но это означает, что мне придется условно просмотреть различные версии позже (то есть UtilitiesMac()
, UtilitiesLinux()
и т. Д.)
Что я здесь пропустил?