将类字段传递给成员函数

时间:2017-02-08 09:05:20

标签: c++ c++11 methods

我有一个类,它有一些大字段(比如一些大矩阵),并且有成员函数来计算这些矩阵(当然,矩阵的实际数量更大)

class MyClass  {
protected:
    MatrixType m_11, m_12;
public:
    void compute_m_11(double x);
    void compute_m_12(double x);
}

现在,计算代码非常相似,最复杂的部分是矩阵元素的正确索引(对于所涉及的所有矩阵都是相同的)。所以我在考虑将索引和计算分成单独的函数:compute_matrix函数,它将执行索引并为矩阵中的每组索引调用compute_element函数。这将极大地提高代码的可读性并简化调试。

因此compute_matrix函数会对我需要填写的类字段MatrixTypestd::function进行实际计算。我显然想避免编写任何涉及额外复制矩阵的内容,因为它们可能非常大。

所以,问题是:

  1. 将对类字段的引用传递给类成员函数是否合法/有效?
  2. 如果是,我是否需要使用std::bind来传递计算成员函数? compute_elements函数需要访问MyClass
  3. 的其他一些字段

    这就是我的想法:

    class MyClass  {
    protected:
        MatrixType m_11, m_12;
        double compute_elements_m11(int i, int j, double x);
        double compute_elements_m12(int i, int j, double x);
        void compute_matrix(MatrixType &m, double x, std::function<double(int, int, double) > f);
    public:
        void compute_m_11(double x) {compute_matrix(m_11, x, compute_elements_m11);};
        void compute_m_12(double x) {compute_matrix(m_12, x, compute_elements_m12);};
    }
    

3 个答案:

答案 0 :(得分:3)

传递成员引用是合法的(并非罕见),但您的函数类型是错误的 您可以使用std::bind,也可以使用普通指针指向成员:

class MyClass  {
protected:
    MatrixType m_11, m_12;
    double compute_elements_m11(int i, int j, double x);
    double compute_elements_m12(int i, int j, double x);
    void compute_matrix(MatrixType &m, double x, double (MyClass::*f) (int, int, double);
public:
    void compute_m_11(double x) {compute_matrix(m_11, x, &MyClass::compute_elements_m11);};
    void compute_m_12(double x) {compute_matrix(m_12, x, &MyClass::compute_elements_m12);};
};

std::bindstd::function提供了更灵活的实施方式。

答案 1 :(得分:0)

当然,将类属性传递给内部成员函数并且您也可以使用std:bind来调用成员函数并不罕见,但问题是您真的需要它还是只能使用简单的“如果“或类似的东西决定使用什么?我会说这取决于你的代码路径有多少选择来决定更好。

答案 2 :(得分:-1)

为什么要将类字段的引用传递给类成员函数?更好的解决方案是实现get方法并在compute_matrix函数中使用它。你的课将看起来像这样:

class MyClass  {
protected:
    MatrixType m_11, m_12;
    double compute_elements_m11(int i, int j, double x);
    double compute_elements_m12(int i, int j, double x);
    void compute_matrix(double x, std::function<double(int, int, double) > f);
public:
    void compute_m_11(double x) {compute_matrix(x, compute_elements_m11);};
    void compute_m_12(double x) {compute_matrix(x, compute_elements_m12);};

    MatrixType& getMatrixType_11( return m_11 );
    MatrixType& getMatrixType_12( return m_12 );

}