美文网首页
给类做一个成员函数表

给类做一个成员函数表

作者: 马鹏飞_47c5 | 来源:发表于2019-11-10 14:10 被阅读0次

类的函数表

给所有有限元基函数做了一个函数表。就是把类的成员函数的指针封装进一个容器里。

基函数的函数类型为basis_type

typedef double(BasisFunction::* basis_type)(double, double);

函数表为basis

std::vector<std::map<std::string, basis_type>> basis;

使用时只要这样就行了:basis[1]["dx"]

#BasisFunction.h
#pragma once
#include <functional>
#include <map>
#include <string>
#include <vector>
#include "MeshElement.h"

class BasisFunction;
typedef double(BasisFunction::* basis_type)(double, double);


class BasisFunction {
public:
    std::vector<std::map<std::string, basis_type>> basis;
    BasisFunction(const MeshElement& e) {
        auto c = e.coordinates;
        x1 = c[0][0]; y1 = c[0][1];
        x2 = c[1][0]; y2 = c[1][1];
        x3 = c[2][0]; y3 = c[2][1];
        _j = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
        /// this part is ugly.
        /// "bind" can be used to replace these lines.
        std::map<std::string, basis_type> basis_map; 
        basis_map.erase(basis_map.begin(), basis_map.end());
        basis_map["original"] = &BasisFunction::basis_1;
        basis_map["dx"]       = &BasisFunction::basis_1_dx;
        basis_map["dy"]       = &BasisFunction::basis_1_dy;
        basis.push_back(basis_map);
        basis_map.erase(basis_map.begin(), basis_map.end());
        basis_map["original"] = &BasisFunction::basis_2;
        basis_map["dx"]       = &BasisFunction::basis_2_dx;
        basis_map["dy"]       = &BasisFunction::basis_2_dy;
        basis.push_back(basis_map);
        basis_map.erase(basis_map.begin(), basis_map.end());
        basis_map["original"] = &BasisFunction::basis_3;
        basis_map["dx"]       = &BasisFunction::basis_3_dx;
        basis_map["dy"]       = &BasisFunction::basis_3_dy;
        basis.push_back(basis_map);
    }


    double get_jacobian_determian() {
        return _j;
    }

    double basis_1(double x, double y) {
        return -x_reference(x, y) - y_reference(x, y) + 1;
    }
    double basis_1_dx(double x, double y) {
        return -(y3 - y1) / _j - (y1 - y2) / _j;
    }
    double basis_1_dy(double x, double y) {
        return -(x1 - x3) / _j - (x2 - x1) / _j;
    }

    double basis_2(double x, double y) {
        return x_reference(x, y);
    }
    double basis_2_dx(double x, double y) {
        return (y3 - y1) / _j;
    }
    double basis_2_dy(double x, double y) {
        return (x1 - x3) / _j;
    }

    double basis_3(double x, double y) {
        auto z = y_reference(x, y);
        return z;
    }
    double basis_3_dx(double x, double y) {
        return (y1 - y2) / _j;
    }
    double basis_3_dy(double x, double y) {
        return (x2 - x1) / _j;
    }


private:

    // the determinant of jacobian matrix.
    double _j;
    // coordinates
    double x1, x2, x3, y1, y2, y3;

    // reference coordinates.
    double x_reference(double x, double y) {
        return ((y3 - y1) * (x - x1) - (x3 - x1) * (y - y1)) / _j;
    };
    double y_reference(double x, double y) {
        return (-(y2 - y1) * (x - x1) + (x2 - x1) * (y - y1)) / _j;
    };
};

相关文章

  • 给类做一个成员函数表

    类的函数表 给所有有限元基函数做了一个函数表。就是把类的成员函数的指针封装进一个容器里。 基函数的函数类型为bas...

  • 力卉编程 | C语言 | 模板类定义

    C++ 中类模板的写法如下: template <类型参数表>class 类模板名{成员函数和成员变量}; 类型参...

  • [转]深度探索C++对象模型(4)

    类中函数的深度探索 类中包含的函数主要有三种:static成员函数、nostatic成员函数、virtual成员函...

  • Python高级

    Python的面向对象 类 Class 类变量 Class variable 数据成员 Data member 函...

  • 模板与泛型 —— using 定义模板别名

    一、类的成员函数模板 二、using 定义模板别名 一、类的成员函数模板 普通类和模板类,其成员函数都可以是模板函...

  • [陈宗权C++]C++第5天AM--运算符重载_继承

    参考: 重点: 子类可以改写来自父类的成员,隐藏来自父类的同名成员,只要同名,就能隐藏,参数表不同,也能隐藏!!!...

  • 对象进阶

    1.this 构造函数里面的this,用于给类定义成员(属性和方法) 方法里面的this,指向方法的调用者 箭头函...

  • C++ - 成员函数的重载及内联成员函数

    内联成员函数 inline+ 成员函数 整个函数体出现在类定义内部 成员函数的重载及参数缺省 重载成员函数 成员函...

  • 十、友元

    采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函 数一般定义为公有的,依此提供类与外界...

  • Eleven Day(面向对象之继承I)

    Java三大特性之一:继承 extends:一个类继承其它类的成员变量和成员函数。不能继承构造函数 在子类的构造函...

网友评论

      本文标题:给类做一个成员函数表

      本文链接:https://www.haomeiwen.com/subject/qthabctx.html