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

时间:2015-07-02 20:41:59

标签: c++ arrays class constructor

很抱歉这个令人困惑的标题,基本上我创建了两个类,一个是对象,另一个是包含这些对象数组的框。所以我想要做的是在对象类中创建一个函数/构造函数,它接受一个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;
}

3 个答案:

答案 0 :(得分:2)

你应该真的使用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_;
};

答案 1 :(得分:0)

我建议您使用std::vector。数组传递给函数并不能很好地工作。定义Object::Object(int Values[])时,您只是按值传递此数组的第一个元素。如果你使用向量,函数将如下所示:

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

答案 2 :(得分:0)

代码的问题在于您对数组的思考。在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];
    }
}

<强> -CAUTION - 我刚刚调整了您提供的代码,并添加了一些约定。代码中有几个地方我不确定目的是什么,但是你去了。这应该会给你一个良好的开端。