gpt4 book ai didi

c++ - 关于这个抽象类的实现,我有什么不明白的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:14:27 24 4
gpt4 key购买 nike

前言:我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com