宿題の解決策を見つけるのに苦労しています。これが私がやろうとしていることです: ベクトルに格納されたオブジェクトのリストがあります。「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;
}
オブジェクトを読み取った後、関数を記述して 1 つのオブジェクトを生成し、それをユーザーが使用できるオブジェクトのスタックにプッシュする必要があります。
Object* generate_object(){
return AvailableObjects.at(rand_in_range(1,AvailableObjects.size()));
}
上記のコードは、私が使いたかったものです。ベクトルに格納されているオブジェクトの 1 つをランダムに選択し、そのオブジェクトのポインターを関数の呼び出し元に戻す必要があります。ただし、ベクトル内のオブジェクトは 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* を返すようにするために助けが必要です。