0

宿題の解決策を見つけるのに苦労しています。これが私がやろうとしていることです: ベクトルに格納されたオブジェクトのリストがあります。「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* を返すようにするために助けが必要です。

4

2 に答える 2

1

まず、範囲は 1 ではなく 0 から開始する必要があります。次に、次のリンクのように型キャストすることで const を削除できます

http://msdn.microsoft.com/en-US/library/bz6at95h(v=vs.80).aspx

于 2012-10-30T22:46:01.623 に答える
1

ベクトルのインデックスは 0 であるため、 の有効な範囲はAvailableObjects.atです0 to AvailableObjects.size()-1

そうTreat(const Treat& t)あるべきでObject(const Object& t)あり、転記を間違えたと仮定すると、あなたが言ったようにはなりませんconst Object*。const ポインターではなく const 参照を取るため、ポインターを逆参照する必要があります。たとえば、AvailableObjects の 5 番目のオブジェクトのディープ コピーを作成する場合は、次のようにします。

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);
于 2012-10-30T23:35:43.483 に答える