我无法找到家庭作业的解决方案。这是我想要做的: 我有一个存储在矢量中的对象列表。名为“AvailableObjects”的向量是全局声明的。
vector<const Object*> AvailableObjects;
...
void read_obj_file(const char* filename){
ifstream infile (filename, ios::in);
while(!infile.eof()) {
char name[20];
int attribute;
int size = 0;
infile >> name >> attribute >> size;
AvailableObjects.push_back(new Object(name, attribute, size));
}
infile.close();
return;
}
在读取对象之后,我需要编写一个函数来生成单个对象,并将其推送到用户可用的一堆对象。
Object* generate_object(){
return AvailableObjects.at(rand_in_range(1,AvailableObjects.size()));
}
上面的代码是我想要使用的。我需要随机选择存储在向量中的一个对象,并将该对象的指针返回给称为函数的任何对象。但是,这不能完成,因为向量中的对象是const Object *,而不是简单的Object *。这是一个家庭作业,所以我无法修改const值,它们的原型必须保持不变。最后,我将分享对象类。它有一个构造函数,专门用于在传递const Object *时创建一个新对象,但我无法使构造函数按预期工作。
/**
* object.h
*
* Objects are immutable (read-only) once instantiated.
*/
#ifndef OBJECT_H
#define OBJECT_H
#include<string>
using std::string;
class object{
private:
string _name;
int _attribute;
int _size;
public:
// Constructor
Object(string name, int attribute, int size){
_name = name;
_attribute = attribute;
_size = size;
}
Treat(const Treat& t){
_name = t._name;
_attribute = t._attribute;
_size = t._size;
}
// Accessors
string name() const {return _name;}
int attribute()const {return _attribute;}
int size() const {return _size;}
};
#endif
此处,也是在整个代码中显示的一个函数,它选择特定范围内的随机数。
int rand_in_range(int low, int high){
init_rand();
high < low ? throw "Invalid range." : 0 ;
int modbase = ((high+1) - low);
int ans = 0;
ans = rand() % modbase + low;
return ans;
}
感谢您的回复,我会积极地观看,所以,如果有人有任何问题,我会很乐意回复。再说一遍,总结一下,我需要帮助让我的generate_object函数使用const Object *的向量返回一个Object *。
答案 0 :(得分:1)
首先,范围应该从零而不是一个开始。其次,您可以通过类型转换来删除const,如下面的链接
http://msdn.microsoft.com/en-US/library/bz6at95h(v=vs.80).aspx
答案 1 :(得分:1)
向量为零索引,因此AvailableObjects.at
的有效范围为0 to AvailableObjects.size()-1
。
假设Treat(const Treat& t)
应该是Object(const Object& t)
并且您在转录时犯了错误,那么就不会像您所说的那样const Object*
。由于它需要const引用,而不是const指针,因此必须取消引用指针。例如,如果我们想在AvailableObjects中制作第五个对象的深层副本,我们会这样做:
int index = 4; // 0, 1, 2, 3, 4... thus index 4 refers to the fifth item.
const Object* object = AvailableObjects.at(index);
Object* clone = new Object(*object);