将此传递给此类变量的方法

时间:2016-09-06 10:11:05

标签: c++ design-patterns

我的代码中存在以下情况,并且不知道它是否显示出一些错误的设计。

class A
{
public:
   ...
   void estimateParameters(const std::vector<double> &data);
private:
   B m_algorithm;
   int m_parameter1;
   int m_parameter2;
};

void A::estimateParameters(const sdt::vector<double> &data)
{
   m_algorithm.estimate(this, data);  // And then m_parameter1 and m_parameter2 are filled
}

estimateParameters的实现调用estimate的{​​{1}}方法,该方法接收指向B的指针作为参数。这听起来有点奇怪,似乎多余。我正在使用此方案来封装this的参数估计,而不强制用户在其代码中手动创建A的实例,然后传递B。这是一种使参数估计对用户透明的方法。

这类计划很常见?你认为这是最好的方法吗?任何不那么多余或更清晰的替代方案?

谢谢

3 个答案:

答案 0 :(得分:1)

为了使这个更清洁,我将参数作为结构传递。 B级不需要了解A类的所有内容。

示例代码

// Struct that class B can use without having to 'know' about class A
struct EstimateParameters
{
    int m_parameter1;
    int m_parameter2;
};

class B
{
public:
    void estimate(const EstimateParameters& estimateParams, const std::vector<double> &data)
    {
        /*  Use estimate params to act on data. 
            We don't care about the whole of class A, only performing estimates */
    }
};

// Class A now composed of EstimateParameters.
class A
{
public:
    void estimateParameters(const std::vector<double> &data);
private:
    EstimateParameters m_estimateParams;
    B m_algorithm;
};

// Passing only the private structure of params, not details of the whole of class A.
void A::estimateParameters(const std::vector<double> &data)
{
    m_algorithm.estimate(m_estimateParams, data);  
}

根据有用的评论编辑此答案,谢谢大家!

答案 1 :(得分:1)

你的设计让我想起了Strategy pattern,这个例子对我来说很有意义。

此处的一个问题是B取决于A。您可以通过引用传递参数(而不是this-pointer)来删除此依赖项。

m_algorithm.estimate(m_parameter1, m_parameter2, data);

此外,定义一个Parameters类(或struct)可能是有意义的。

struct Parameters {
    int m_parameter1;
    int m_parameter2;
}

class A {
public:
    void estimateParameters(const std::vector<double>& data);
private:
    B m_algorithm;
    Parameters m_parameters;
};

void A::estimateParameters(const std::vector<double>& data) {
    m_algorithm.estimate(m_parameters, data);
}

void B::estimate(Parameters& parameters, const std::vector<double>& data) { ... }

答案 2 :(得分:-1)

是的,这是将指针传递给对象的好方法。这不是多余的。