gpt4 book ai didi

c++ - 返回类型与重写虚函数 "MediaDevice*"的返回类型 "MediaFactory::FMediaDevice"不相同也不协变

转载 作者:太空狗 更新时间:2023-10-29 21:50:24 25 4
gpt4 key购买 nike

我有以下抽象工厂:

#include  "MediaDevice.h"

class MediaFactory {
public:
MediaFactory();
virtual ~MediaFactory();
virtual MediaDevice * FMediaDevice (int type) = 0;
};

以及继承自抽象工厂的以下工厂:

#include "MediaFactory.h"
class JVCMedDevFactory : public MediaFactory {
public:
MediaDevice* FMediaDevice (int type) {
switch ((type_e)type) {
case CDPlayer_e:
return new JVCCdPlayer() ;
case DVDPlayer_e:
return new JVCVcrPlayer() ;
}
}
};

媒体设备是:

#include <string>
#include <utility>
using namespace std;
class MediaDevice {
public:
MediaDevice();
virtual ~MediaDevice();
virtual void Start () = 0 ;
virtual void Stop () = 0 ;
virtual void Forward () = 0 ;
virtual void Rewind () = 0 ;
virtual pair <string,string> getName () const = 0;
protected:
pair <string,string> DeviceName;
};

这就是我对 JVC 播放器的定义:

#include "MediaDevice.h"
#include <iostream>
using namespace std;
class JVCCdPlayer : public MediaDevice {
public:
JVCCdPlayer(){
DeviceName.first = "JVC";
DeviceName.second = "CD";
}
void Start (){
cout << "Playing " << this->getName().first << "," << this->getName().second << endl;
}
void Stop (){
cout << "Stopped " << this->getName().first << "," << this->getName().second <<endl;
}
void Forward (){
cout << "Rewind " << this->getName().first << "," << this->getName().second <<endl;
}
void Rewind (){
cout << "Forward " << this->getName().first << "," <<this->getName().second <<endl;
}
pair <string,string> getName () const{
return DeviceName;
}
~JVCCdPlayer(){}
};

我得到以下错误

返回类型与重写虚函数“MediaFactory::FMediaDevice”的返回类型“MediaDevice*”不相同也不协变

重要的是,在 visula studio 中,我在 MediaDevice* FMediaDevice (int type) { 类 MedDevFactory 声明中的 FMediaDevice 下有红线。我返回什么并不重要。我可以返回 0,但仍然会收到错误。

为什么?

最佳答案

从错误消息来看,似乎是 JVCCdPlayerJVCVcrPlayer (或两者)不是来自 MediaDevice .是这样吗?

您必须从 MediaDevice 派生两者.确保您的定义如下所示:

class JVCCdPlayer : public MediaDevice
{
};

class JVCVcrPlayer : public MediaDevice
{
};

或者层次结构中的某处,MediaDevice应该存在。


类(class)MediaDevice有成员(member)资料DeviceName这是类型 pair<string,string> ,但您没有包含 pair 所在的 header 被定义为。所以包括 <utility> .同样,请确保您已包含所有必要的 header 。

此外,我不会写 using namespace std在头文件中。所以我会重写 MediaDevice.h作为:

#ifndef MEDIA_DEVICE_H
#define MEDIA_DEVICE_H

#include <string>
#include <utility>

class MediaDevice
{
public:
MediaDevice();
virtual ~MediaDevice();
virtual void Start () = 0 ;
virtual void Stop () = 0 ;
virtual void Forward () = 0 ;
virtual void Rewind () = 0 ;
virtual std::pair<std::string,std::string> getName () const = 0;
private:
std::pair<std::string,std::string> DeviceName;
};

#endif

也就是说,我将用 std:: 限定每个名称而不是 using namespace std .

顺便说一句,我没有看到以下纯虚函数的定义:

virtual pair <string,string> getName () const = 0;

你在派生类中定义了吗? (虽然报错并没有说是这个问题,但是还是要确认一下)。

此外,成员(member)数据DeviceName声明为 private这需要是 protected因为您正在从派生类访问它 JVCVcrPlayerJVCCdPlayer .

关于c++ - 返回类型与重写虚函数 "MediaDevice*"的返回类型 "MediaFactory::FMediaDevice"不相同也不协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165003/

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