很抱歉这个令人困惑的标题,基本上我创建了两个类,一个是对象,另一个是包含这些对象数组的框。所以我想要做的是在对象类中创建一个函数/构造函数,它接受一个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;
}
答案 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 - 强> 我刚刚调整了您提供的代码,并添加了一些约定。代码中有几个地方我不确定目的是什么,但是你去了。这应该会给你一个良好的开端。