- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
前言:我在 C++ 方面相对缺乏经验,所以这很可能是 Day 1 n00b 的问题。
我正在从事一项长期目标是跨多个操作系统可移植的工作。我有以下文件:
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'
所以在这种情况下,我想做的是像使用接口(interface)一样使用抽象类 (Utilities),并让它知道转到实现版本 (UtilitiesWin)。
显然我做错了什么,但我不确定是什么。当我写这篇文章时,我突然想到,我错过了 Utilities 抽象类的 UtilitiesWin 实现之间可能有一个重要的联系,但我不确定在哪里。我的意思是,以下作品
#include <string>
#include "UtilitiesWin.h"
void SomeProgram::SomeMethod()
{
Utilities *u = new UtilitiesWin();
StringData = u->ParseString(StringData); // StringData defined elsewhere
}
但这意味着我以后必须有条件地检查不同的版本(即 UtilitiesMac()
、UtilitiesLinux()
等)
我在这里错过了什么?
最佳答案
Utilities *u = new Utilities();
告诉编译器创建一个Utilities
类的新实例; UtilitiesWin
扩展它的事实不一定为人所知,也不会影响它。可能有很多扩展 Utilities
的类,但您告诉编译器创建 Utilities
的新实例,而不是那些子类。
听起来你想使用工厂模式,即在 Utilities
中创建一个静态方法,返回一个指向特定实例的 Utilities*
:
static Utilities* Utilities::make(void) {return new UtilitiesWin();}
在某些时候,您将不得不实例化一个非抽象子类;没有办法在那个时候指定 UtilitiesWin
关于c++ - 关于这个抽象类的实现,我有什么不明白的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2853133/
我是一名优秀的程序员,十分优秀!