c – 基于概念的多态性

前端之家收集整理的这篇文章主要介绍了c – 基于概念的多态性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在阅读C中基于概念的继承.我为所有人附上了一个代码示例.我基本上问这是否正确实现了这个概念?我是新手,所以我只是放下我的想法.欢迎任何评论/批评.
#include "stdafx.h"
#include <memory>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

struct Point{
    int x;
    int y;
};

class graphics_surface{

    class drawable_concept{
    public:
        virtual void draw(Point const& coordinate) {};
        virtual ~drawable_concept() {};
    };

    template<class T>
    class drawable_model : public drawable_concept{
    public:
        drawable_model(T& item) : item_(item){}
        void draw(Point const& coordinate){
            item_.draw(coordinate);
        }
        ~drawable_model(){}
    private:
        T item_;
    };

public:

    template<class T>
    void push_back(T& drawable){
        v_.push_back(shared_ptr<drawable_concept>( new drawable_model<T>(drawable)));
    }

    void draw(Point const& coordinate) {
        for_each(v_.begin(),v_.end(),[&](shared_ptr<drawable_concept>& concept){
            concept->draw(coordinate);
        });
    }

private:
    vector<shared_ptr<drawable_concept>> v_;
};

struct triangle{
    void draw(Point const& p){
        cout << "Triangle: " << p.x << "," << p.y << endl;
    }
};

struct square{
    void draw(Point const& p){
        cout << "Sqaure: " << p.x << "," << p.y << endl;
    }
};


int _tmain(int argc,_TCHAR* argv[])
{

    Point p;
    p.x = 1;
    p.y = 2;

    graphics_surface surface;
    surface.push_back(triangle());

    surface.draw(p);

    return 0;
}

提前致谢.

布莱尔

解决方法

几点:

>我认为没有任何理由将drawable_concept或drawable_model放在graphics_surface中 – 你只是防止重用在其他容器类型中可能有用的东西……
>你有一些常见问题

> draw应该是const(函数定义不应该用分号;-)
> drawable_model(T& item)应该通过const引用获取项目
> push_back(T& drawable)shoudl通过const引用获取drawable

>你应该使用make_shared来保护异常安全>“工厂”功能可以说是更好的分离成一个单独的功能,而不是埋没在push_back中

原文链接:https://www.f2er.com/c/118403.html

猜你在找的C&C++相关文章