C++ 初始化类内大小可变的数组
我试图根据构造函数的输入参数初始化大小为n的数组。 这项工作:C++ 初始化类内大小可变的数组,c++,arrays,class,arduino,initialization,C++,Arrays,Class,Arduino,Initialization,我试图根据构造函数的输入参数初始化大小为n的数组。 这项工作: //Inside Header class runningAverage{ private: byte n; float array[10]; public: runningAverage(byte); }; //Inside .cpp runningAverage::runningAverage(byte a){ n = a; for (byte i
//Inside Header
class runningAverage{
private:
byte n;
float array[10];
public:
runningAverage(byte);
};
//Inside .cpp
runningAverage::runningAverage(byte a){
n = a;
for (byte i = 0; i<n; i++) {
array[i] = 0;
}
}
//内部标题
班级平均成绩{
私人:
字节n;
浮点数组[10];
公众:
运行平均值(字节);
};
//内部。cpp
runningAverage::runningAverage(字节a){
n=a;
对于(字节i=0;i您必须实际分配数组;并且您需要使用指针类型,float array[]
不是您所认为的那样。正如juanchopanza提醒我们的那样,您还需要禁用复制构造函数和赋值运算符,或者实现执行正确深度复制的构造函数和赋值运算符
//Inside Header
class runningAverage{
private:
byte n;
float *array; // <= correct type
public:
runningAverage(byte);
~runningAverage(); // <= you'll need a destructor to cleanup
private:
runningAverage(const runningAverage &);
runningAverage & operator = (const runningAverage &);
};
//Inside .cpp
runningAverage::runningAverage(byte a){
array = new float[n]; // <= allocate array
n = a;
for (byte i = 0; i<n; i++) {
array[i] = 0;
}
}
// clean up
runningAverage::~runningAverage(){
delete[] array;
}
//内部标题
班级平均成绩{
私人:
字节n;
float*array;//如果您只知道运行时的大小,Jason C的答案就是您想要的
如果在编译时已知大小,则可以使用模板:
template < int SIZE >
class runningAverage
{
float array [ SIZE ];
};
runningAverage < 10 > ra;
模板
班级平均成绩
{
浮点数组[大小];
};
运行平均<10>ra;
或者使用类似于std::array
的类,而不是std::vector
您的成员应该是指针,以便在构造对象时可以进行动态内存分配:float*array;
在构造函数中,使用array=newfloat[a];
在构造函数中,最好使用memset
而不是循环进行初始化
使用析构函数释放内存,该行为:delete[]array;
要将其编译,您需要这一行:#include
要链接,请不要忘记在使用g++
时包含链接器标志-lstdc++
由于您似乎是一名初学者,请查看以下有用的参考资料以供您学习:另外值得注意的是,这是为arduino库编写的!初始化数组时,您需要传递一些值。因此,当您从用户处收到n的值时,您需要传递该值。请阅读有关指针和新建&删除in C++,这将允许你创建一个数组,它希望知道这些东西的相关内容,但是我不知道它是如何关联的。你能给我写个例子吗?最好也提供拷贝和赋值操作符,或者禁用这些操作。哇,谢谢。这解决了我的问题。只是几个问题。如果真的永远不存在,你真的需要析构函数吗?让我直截了当地说,数组被声明为指向一个浮点的指针,您正在为数组分配内存?为什么删除后会有方括号?什么是复制和赋值运算符?@juanchopanzaBTW如果您不需要构造函数中的循环,您可以像这样对数组元素进行零初始化:array=new float[n]();
@user3912409。你应该养成在需要特殊清理时总是定义析构函数的习惯,这有十几个非常好的理由。我经常看到编译器将这样的循环和memset简化为相同的东西。@JasonC Ant将数组归零初始化的惯用方法既不是循环也不是memset
,而是数组=新的浮点[a](;);< /COD>这是很好的。我多年来没有用C++编写。很好的刷新。也不需要包含<代码> <代码>(除非你想使用<代码> STD::BADYOLLC/和<代码> STD::Nojp< /Cord>)对于这一点,g++
隐式链接到libstdc++。您提供的源代码对我帮助很大。非常感谢。使用这种方法比Jason的方法有优势吗?我没有任何模板经验…@user3912409有优点和缺点,这个主题在许多其他地方讨论过,这里有很多内容要讨论。在某些情况下,jasons的答案更适合,在某些情况下,我的答案更适合。与您的需求无关的唯一优势是,我的方法不需要您处理复制/赋值运算符。但是,如果您只使用std::vector
,这个问题也会为您解决。所有其他(dis)每种方法的优点取决于您实际使用此代码的目的,所以我不能在这里回答。哦,是的,我忘记了:我的代码的缺点就像我在回答中所说的,您需要在编译时知道大小。
template < int SIZE >
class runningAverage
{
float array [ SIZE ];
};
runningAverage < 10 > ra;