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

Posted

技术标签:

【中文标题】将数组从另一个类的构造函数传递给类函数【英文标题】:passing an array into a class function from another class's constructor 【发布时间】:2015-07-02 20:41:59 【问题描述】:

抱歉标题令人困惑,基本上我创建了两个类,一个是对象,另一个是包含此类对象数组的框。所以我想做的是在对象类中创建一个函数/构造函数,它接受一个整数数组并将它们存储在盒子里。我希望能够通过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;

【问题讨论】:

T[] (大部分)不是 C++ 中的类型。您的字段 int values[]; 必须是 int *values; 并且还要传递长度,或者更好的是 std::vector&lt;int&gt; values; 你能解释一下关于传递长度的更多信息吗?抱歉,我对 C++ 很陌生 @Flashpaper 他的意思是使用向量而不是数组,因为这样您就不必担心分配集合大小。 与其他语言中的数组不同,您不能将它们传递给函数,即使语法表明您可以。不要上当!相反,在函数内部,你得到的只是一个指针,它不携带任何关于大小的信息。因此,请使用向量。 作为 C++ 新手,我建议学习指针、数组和内存分配。如果在工作中编码,一定要使用vector&lt;&gt; 【参考方案1】:

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

【讨论】:

虽然我完全落后于使用vector&lt;&gt;,但出于学习目的,我建议使用原始指针。不过很好的解决方案。【参考方案2】:

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

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


【讨论】:

应该真正使用ctor的init-list,并且使用std::move而不是复制。【参考方案3】:

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

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

当然,大多数人都坚持使用vector&lt;&gt;,因为它更容易,处理内存泄漏(大部分)并且非常高效。但我喜欢自己做。这是对你有好处。我会尝试:

#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];
    

-注意- 我刚刚修改了您提供的代码,并添加了一些约定。代码中有几个地方我不确定目的是什么,但你去吧。这应该会给您一个良好的开端。

【讨论】:

以上是关于将数组从另一个类的构造函数传递给类函数的主要内容,如果未能解决你的问题,请参考以下文章

在另一个类的声明中将参数传递给类构造函数

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

将参数传递给超类构造函数

如何将参数传递给静态类构造函数?

如何将构造函数与数组一起使用?