我的代码中存在以下情况,并且不知道它是否显示出一些错误的设计。
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
。这是一种使参数估计对用户透明的方法。
这类计划很常见?你认为这是最好的方法吗?任何不那么多余或更清晰的替代方案?
谢谢
答案 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)
是的,这是将指针传递给对象的好方法。这不是多余的。