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()等)
我错过了什么?
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在那一点上无法指定
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |