【问题标题】: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;

标签: c++ arrays class constructor


【解决方案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];
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2011-10-12
    相关资源
    最近更新 更多