【问题标题】:C++ how to make a class type more general and use it as a kind of interfaceC ++如何使类类型更通用并将其用作一种接口
【发布时间】:2013-03-26 07:38:50
【问题描述】:

我有一个名为“OpenGLCamera”的类 还有另一个类需要相机,所以目前他有 OpenGLCamera(因为该类被用作一种类型) 像这样:

void draw(const OpenGLCamera& camera);

但我希望它更通用,所以我希望它是

void draw(const SomeCamera& camera);

这个“SomeCamera”当然应该是指向 OpenGLCamera 的指针/引用或其他东西!

我有一个名为“Visual_settings”的类..我听说我应该使用继承来实现这一点......但我不明白如何......如何做到这一点?在 Visual_Settings 类中?让它成为...的基类,然后呢??

Visual_Settings.h

#include "OpenGLCamera.h"
class Visual_Settings : public OpenGLCamera
{

};

提前致谢

【问题讨论】:

    标签: c++ class inheritance types


    【解决方案1】:

    您正在寻找的泛型类型是SomeCamera,那么OpenGLCamera 应该派生自该类型SomeCamera。如果你不能这样做,那么你需要使用适配器模式。如果您有其他类型的相机,这将是有意义的。

        class SomeCamera
        {
        public:
            virtual void Dowork()=0;
        };
    
        class OpenGLCamera : public SomeCamera
        {
        public:
            virtual void Dowork() override
            {
                //use camera
            }
        };
    

    //方法2(桥接模式):无法修改OpenGLCamera时:

    //***使用合适的构造函数/析构函数,并根据需要初始化基类构造函数

        class SomeCamera
        {
        public:
            virtual void Dowork()=0;
        };
    
        class OpenGLCamera 
        {
        public:
           void OpenGlDowork() 
            {
                //use camera
            }
        };
    
        class OpenGLCameraAdapter : public SomeCamera, OpenGLCamera
        {
        public:
            virtual void Dowork() override
            {
                //use camera
                OpenGlDowork();
    
        }
    };
    

    【讨论】:

    • 好吧,我确实会使用第一种方法!以及如何使 OpenGLCamera 的构造函数虚拟化?既然我不能改变那个名字对...?还是我应该只创建一个虚拟构造函数“SomeCamera”?和一个虚拟的“OpenGLCamera”,它会看到它应该从一个链接到另一个吗?
    • 构造函数不是虚拟的,接口是纯虚拟的。析构函数也应该是虚拟的。我说根据您的需要使用适当的构造函数,即初始化。我没有展示,构造函数和析构函数假设你会根据你的需要拥有它们。
    【解决方案2】:
    1. OpenGLCamera 应该继承自 SomeCamera
    2. SomeCamera 应该有接口,它将在OpenGLCamera 中被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2022-12-05
      • 1970-01-01
      相关资源
      最近更新 更多