将数组从另一个类的构造函数传递到类函数中

passing an array into a class function from another class's constructor

本文关键字:类函数 构造函数 数组 另一个      更新时间:2023-10-16

很抱歉标题令人困惑,基本上我已经创建了两个类,一个是对象,另一个是包含此类对象数组的框。所以我想做的是在对象类中创建一个函数/构造函数,它接受一个int数组并将它们存储在框中。我希望能够通过box类构造函数调用这个函数来初始化这些对象。所以我尝试了下面的方法,但根本不起作用,因为只有数组的第一个值通过。我做错了什么?

#include <iostream>
#include <string>
class object{
     string objectName;
     int values[];
public:
     void createObject(int[]);
}
class Box{
    object objects[100];
public:
    Box();
}
Box::Box (void){
    int array1[2];
    int array2[15];
    object[1].createObject(array1);
    object[2].createObject(array2);
}
Object::Object(int Values[]){
    values = Values;
}

您真的应该使用std::vector。数组的问题是,当作为参数传递给函数时,它们会衰减为指针。因此,如果你想存储元素的私有副本,你就必须使用堆分配的对象,从而手动进行内存管理(这会带来很多痛苦(。

依赖允许应用零规则的数据成员要好得多。

这里有一个初步的解决方案:

#include <iostream>
#include <string>
#include <vector>
class object {
public:
    object(std::vector<int> const& v, std::string const& object_name): v_(v.begin(), v.end()), object_name_(object_name) {}
private:
    std::vector<int> v_;
    std::string object_name_;
};

class box {
public:
    box(std::vector<object> const& objects): objects_(objects) {};
private:
    std::vector<object> objects_;
};

我建议您改用std::vector。数组在传递给函数时并不能很好地工作。当您定义Object::Object(int Values[])时,您只是按值传递这个数组的第一个元素。如果你使用矢量,函数会像这样:

Object::Object(std::vector<int> &Values):
    values(Values)
{
}

代码的问题在于你对数组是什么的思考。在C++中,数组只是一个内存指针。该语言允许您将索引传递到数组指针中,以访问该索引中的任何数据块。

每当在函数或类之间传递数组时,只传递数组名称它将被解释为指针,不会复制任何数据。执行此操作时,还必须传递数组的长度。

诚然,大多数人坚持使用vector<>,因为它更容易,(主要(可以处理内存泄漏,而且非常高效。但我喜欢自己做。这对你有好处。我会试试:

#include <iostream>
#include <string>
class Object
{
    string _objectName;
    int *_values;
    int _myLength;
    Object();
    ~Object();
    void createObject(int *pValues, int arrLength);
}
class Box
{
    _Object objects[100];
    Box();
}
Box::Box(void) {
    int array1[2];
    int array2[15];
    object[1].createObject(array1, 2);
    object[2].createObject(array2, 15);
}
Object::Object() {
    _values = null_ptr;
    _myLength = 0;
}
Object::~Object() {
    delete[] _values;
}
void Object::createObject(int *pvalues, int arrLength) {
    _myLength = arrLength;
    _values = new int[_myLength];
    for(int ndx=0; ndx<arrLength; ndx++) {
        _values[ndx] = pvalues[ndx];
    }
}

-小心-我只是调整了您提供的代码,并添加了一些约定。代码中有几个地方我不确定目的是什么,但你可以了。这应该会给你一个良好的开端。