2012-10-30 3 views
0

숙제에 대한 해결책을 찾는 데 어려움이 있습니다. 여기에 내가 뭘하려고하는지 : 나는 벡터로 저장된 객체들의 목록을 가지고있다. "AvailableObjects"라는 벡터가 전역 적으로 선언됩니다.함수 Const 포인터의 벡터에서 생성 된 포인터를 반환하는 중

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 값을 수정할 수 없으므로 프로토 타입은 동일하게 유지되어야합니다. 마지막으로, 나는 객체 클래스를 공유 할 것이다. Construct 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 

여기에 또한 특정 범위에서 임의의 숫자를 선택하는 코드 전체에 표시되는 기능입니다.

모든 응답을 주셔서 감사 드리며, 적극적으로이를 관찰 할 것입니다. 질문이 있으시면 기꺼이 답변 해 드리겠습니다. 다시 요약하자면, generate_object 함수를 사용하여 const Object * 벡터를 사용하여 Object *를 반환하는 데 도움이 필요합니다.

+0

보조 노트 : 우리가 AvailableObjects에서 다섯 번째 객체의 전체 복사본을 만들고 싶었다 예를 들어, 우리가 할 것이라고 생성자를'클래스 object' 및 Object''라는 생성자를 복사'Treat' 원 정확하게 컴파일하기 시작하는 것도 아닙니다. 그것에 관한 답변을 원하시면 ** 유효한 코드 **를 게시하십시오. – WhozCraig

답변

1

벡터가 제로 색인 다음 링크처럼 캐스팅 유형별로 const를 제거 할 수 있습니다, 그래서 AvailableObjects.at의 유효 범위는 0 to AvailableObjects.size()-1입니다.

추정치가 Treat(const Treat& t) 인 경우는 Object(const Object& t)이어야하며 사용자가 실수를 저 지르면 실수로 const Object*이 표시되지 않습니다. const 포인터가 아닌 const 참조가 필요하므로 포인터를 참조 해제해야합니다.

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); 
관련 문제