我没有得到关于这个抽象类实现的内容?

Tom*_*idd 1 c++ abstract-class

前言:我在C++方面相对缺乏经验,所以这很可能是第1天的n00b问题.

我正在研究一些长期目标是可跨多个操作系统移植的东西.我有以下文件:

Utilities.h

#include <string>

class Utilities
{
public:
    Utilities() { };
    virtual ~Utilities() { };

    virtual std::string ParseString(std::string const& RawString) = 0;
};
Run Code Online (Sandbox Code Playgroud)

UtilitiesWin.h(用于Windows类/实现)

#include <string>
#include "Utilities.h"

class UtilitiesWin : public Utilities
{
public:
    UtilitiesWin() { };
    virtual ~UtilitiesWin() { };

    virtual std::string ParseString(std::string const& RawString);
};
Run Code Online (Sandbox Code Playgroud)

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 "";
}
Run Code Online (Sandbox Code Playgroud)

那么在我的代码中的其他地方我就有了这个

#include <string>
#include "Utilities.h"

void SomeProgram::SomeMethod()
{
    Utilities *u = new Utilities();
    StringData = u->ParseString(StringData); // StringData defined elsewhere
}
Run Code Online (Sandbox Code Playgroud)

编译器(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'
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,我想要做的是使用抽象类(Utilities)就像一个接口,让它知道去实现版本(UtilitiesWin).

显然我做错了但我不确定是什么.在我写这篇文章的过程中,我发现在UtilitiesWin实现的Utilities抽象类之间可能存在一个重要的联系,我错过了,但我不知道在哪里.我的意思是,以下工作

#include <string>
#include "UtilitiesWin.h"

void SomeProgram::SomeMethod()
{
    Utilities *u = new UtilitiesWin();
    StringData = u->ParseString(StringData); // StringData defined elsewhere
}
Run Code Online (Sandbox Code Playgroud)

但它意味着我不得不有条件通过不同的版本去后(即UtilitiesMac(),UtilitiesLinux()等)

我错过了什么?

Mic*_*zek 7

Utilities *u = new Utilities();
Run Code Online (Sandbox Code Playgroud)

告诉编译器创建类的新实例Utilities; UtilitiesWin扩展它的事实不一定是已知的,也不会影响它.可能会有很多类扩展Utilities,但是你告诉编译器创建一个新实例Utilities,而不是那些子类.

听起来你想要使用工厂模式,这是一个静态方法Utilities,返回一个Utilities*指向特定实例的方法:

static Utilities* Utilities::make(void) {return new UtilitiesWin();}
Run Code Online (Sandbox Code Playgroud)

在某些时候,你将不得不实例化一个非抽象的子类; UtilitiesWin在那一点上无法指定