我正在将一些算法实现到一个现有程序中。简而言之,我创建了一个新类“Adder”。Adder是另一个表示实际执行计算的物理对象的成员,该对象使用其参数(仅为要进行数学运算的对象列表)调用
为了进行这些数学运算,我需要一些参数,在类外部不存在(但可以设置,请参见下文)。它们既不是配置参数,也不是其他类的成员。这些参数是D1和D2,距离,以及三个固定大小的数组:alpha,beta,delta。
我知道你们中的一些人更喜欢阅读代码而不是阅读文字,所以给你们提供以下代码片段:
通过这样做,我无法直接在构造函数中初始化数组(alpha/beta/delta)(
我的第二个猜测是使用构造函数来初始化数组:
adder.calc()
。为了进行这些数学运算,我需要一些参数,在类外部不存在(但可以设置,请参见下文)。它们既不是配置参数,也不是其他类的成员。这些参数是D1和D2,距离,以及三个固定大小的数组:alpha,beta,delta。
我知道你们中的一些人更喜欢阅读代码而不是阅读文字,所以给你们提供以下代码片段:
class Adder
{
public:
Adder();
virtual Adder::~Adder();
void set( float d1, float d2 );
void set( float d1, float d2, int alpha[N_MAX], int beta[N_MAX], int delta[N_MAX] );
// Snipped prototypes
float calc( List& ... );
// ...
inline float get_d1() { return d1_ ;};
inline float get_d2() { return d2_ ;};
private:
float d1_;
float d2_;
int alpha_[N_MAX]; // A #define N_MAX is done elsewhere
int beta_[N_MAX];
int delta_[N_MAX];
};
由于这个对象被用作另一个类的成员,因此它在*.h文件中声明:
private:
Adder adder_;
通过这样做,我无法直接在构造函数中初始化数组(alpha/beta/delta)(
int T[3] = {1, 2, 3};
),而不必遍历这三个数组。 我考虑将它们放入 static const 中,但我认为这不是解决此类问题的正确方法。我的第二个猜测是使用构造函数来初始化数组:
Adder::Adder()
{
int alpha[N_MAX] = { 0, -60, -120, 180, 120, 60 };
int beta[N_MAX] = { 0, 0, 0, 0, 0, 0 };
int delta[N_MAX] = { 0, 0, 180, 180, 180, 0 };
set( 2.5, 0, alpha, beta, delta );
}
void Adder::set( float d1, float d2 ) {
if (d1 > 0)
d1_ = d1;
if (d2 > 0)
d2_ = d2;
}
void Adder::set( float d1, float d2, int alpha[N_MAX], int beta[N_MAX], int delta[N_MAX] ) {
set( d1, d2 );
for (int i = 0; i < N_MAX; ++i) {
alpha_[i] = alpha[i];
beta_[i] = beta[i];
delta_[i] = delta[i];
}
}
是否使用另一个函数(init()
)来初始化数组会更好?或者有更好的方法吗?
你是否注意到了一些错误或不良实践?
6
而非N_MAX
。(无论如何,您都不能传递数组,它们会降级为指针。)我认为您尝试在构造函数中以某种方式初始化数组是行不通的。您将不得不逐个分配每个成员(可能在循环中)。 - sbiAdder::set()
。 - sbi