将数组从另一个类的构造函数传递到类函数中
passing an array into a class function from another class's 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;
}
您真的应该使用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];
}
}
-小心-我只是调整了您提供的代码,并添加了一些约定。代码中有几个地方我不确定目的是什么,但你可以了。这应该会给你一个良好的开端。
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 UML 类图中为C++类添加构造函数和析构函数
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 两个父类的构造函数的序列
- 使用带有虚函数的类的构造函数进行大括号初始化
- 在模板化类的构造函数中调用构造函数
- 如何将我编写的对象传递到另一个类的构造函数中?
- 在初始化列表之外手动调用基类的构造函数
- 在C++中将对象从另一个类传递到另一个类的构造函数?
- 使第二个类的构造函数成为第一个类中的友元函数
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 根据参数数调用 mixin 基类的构造函数
- 使用迭代器的模板类的构造函数
- 你能在类和构造函数中初始化吗,这是否正确?
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 定义类模板构造函数的两种方法之间的区别
- 在dynamic_pointer_cast后调用派生类的构造函数
- 带有模板的类的构造函数
- C++ - 使用另一个类的构造函数实例化一个对象