1

このような単純なクラスがある場合:

class MyClass
{
    MyClass(){}
    ~MyClass(){}
public:   
    int myArrayKeyValue;
};

そして後で、これらのクラスの配列を作成します。

MyClass testing[10];

myArrayKeyValueコンストラクターで、配列の各要素に適切に設定できるように、配列キーにアクセスするにはどうすればよいですか?私がこれを手に入れるために:

testing[0].myArrayKeyValue = 0;
testing[1].myArrayKeyValue = 1;
testing[2].myArrayKeyValue = 2;
testing[3].myArrayKeyValue = 3;
etc...

コンストラクターでこれを実現することは可能ですか?または、配列をループして値を手動で割り当てる必要がありますか?

4

6 に答える 6

3

コンストラクターでこれを実現することは可能ですか?

いいえ。

または、配列をループして値を手動で割り当てる必要がありますか?

はい。ただし、これらのインスタンスの内外インデックスに関する知識が不要になるように再設計できる場合があります。

考えられる代替案は次のとおりです。

  • のような連想コンテナmap<int, MyClass>
  • set<MyClass>キー値が順序付け基準であるa
于 2010-07-11T17:09:19.030 に答える
0

コンストラクターから直接これを行うことはできません。配列内のオブジェクトの場所にはアクセスできません。初期化を行うには、ループを作成する必要があります。

または、コンストラクターからインクリメントするグローバルカウンターまたは静的カウンターを使用します。これについても言及することに少しうんざりしています。構築順序は、アレイの最初から最後まで進行することが保証されているため、技術的には機能します。しかし、それはひどいです。

(ちなみに、この例のコンストラクターはプライベートであるため、配列宣言はコンパイルされません。)

于 2010-07-11T17:10:49.613 に答える
0

staticコンストラクターでインクリメントされる単純なゼロベースのメンバーが実行する必要があります。ただし、アレイを作成する前にリセットする必要があります。これが良いアイデアかどうかは、まったく別のトピックです:)

于 2010-07-11T17:12:02.707 に答える
0

このようなことが可能になります:

class MyClass { 
public: 
  MyClass(int index) { myArrayKeyValue = index; } 
  ~MyClass();
private:
int myArrayKeyValue;
}; 

int main() 
{ 
  MyClass testing[5] = { MyClass(1), MyClass (2), 
                   MyClass (3), MyClass (4), MyClass (5) };

  return 0; 
}
于 2010-07-11T17:27:31.097 に答える
0

あなたが望む最終結果を検討し、他の手段でそれを達成しようとすることは価値があるかもしれません。

続行する1つの方法は、次のとおりです。

std::vector<MyClass> v;
for (size_t i=0; i<nCount; i++)
    v.push_back(MyClass(static_cast<int>(i)));
于 2010-07-11T17:38:33.713 に答える
-1

次のように静的カウンターを使用することもできます。

class MyClass {
    static size_t static_counter;

    size_t m_value;
public:
    MyClass() {
        m_value = static_counter++;
    }

    inline static void reset() {
        static_counter = 0;
    }

    inline size_t get_value() const {
        return m_value;
    }
};

size_t MyClass::static_counter = 0;

ただし、手動でリセットする責任があります。そうしないと、メモリの不法侵入が発生します。これは、より高いレベルでカプセル化することで修正されます(デストラクタでリセット)。

編集:私はNikolai N Fetissovと同じ考えを持っていました、そして予想しました:静的メンバーそれ自体はマルチスレッドプログラムで使用されるべきではありません。

于 2010-07-11T17:19:53.320 に答える