函数返回从Const指针向量生成的指针

时间:2012-10-30 22:40:10

标签: c++ pointers vector const

我无法找到家庭作业的解决方案。这是我想要做的: 我有一个存储在矢量中的对象列表。名为“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 *。

2 个答案:

答案 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);