因为我知道初始化构造函数的初始化列表中的所有成员通常要好得多,所以我想知道是否也可以在初始化列表中用 c++ 进行一些更复杂的构造。在我的程序中,我想构建一个初始化它的两个成员向量的类。由于我经常使用它们,我想缓存内容,因此我想在构造时创建向量。
编辑我想缓存这些值的主要原因是我可以从具有任何半径的圆生成 x 和 y 坐标,而无需重新计算 sin 和 cosine 值。所以我使用 n (n_samples) 作为 sinx 和舒适向量的粒度,我在内部将其用作查找表。
那么是否可以在初始化列表中进行初始化,这样构造函数只需要知道它应该创建多少个样本?
请注意:在写一个简短的自包含问题时,我为分别具有圆的 x 和 y 坐标的向量写了 sinx 和 cosy。我可以改变这一点,但我会让下面的答案无效。角度的正弦给出 y 坐标,余弦通常给出 x 值。
#include <vector>
#include <iostream>
#include <cmath>
class circular {
public:
circular( unsigned n = 20 );
/* In my actual program I do much more
* complicated stuff. And I don't want
* the user of this class to be bothered
* with polar coordinates.
*/
void print_coordinates( std::ostream& stream, double radius );
private:
unsigned number_of_samples;
std::vector<double> sinx;
std::vector<double> cosy;
};
circular::circular( unsigned n )
:
number_of_samples(n) //I would like to initialize sinx cosy here.
{
for ( unsigned i = 0; i < number_of_samples; ++i ){
sinx.push_back( std::sin( 2*M_PI / number_of_samples*i ) );
cosy.push_back( std::cos( 2*M_PI / number_of_samples*i ) );
}
}
void
circular::print_coordinates( std::ostream& stream, double r)
{
for ( unsigned i = 0; i < sinx.size(); ++i ) {
stream << "{ " <<
sinx[i] * r <<
" , " <<
cosy[i] * r <<
" } " <<
std::endl;
}
}
int main () {
circular c(20);
c.print_coordinates(std::cout, 4);
c.print_coordinates(std::cout, 5);
return 0;
}
非常感谢您的努力。
赫特珀凡