2

Windows7上のVisualStudio2010Ultimate。

編集:これは私が書いたのではない非常に古いコードであり、コードベースに深く根ざした大きな古い混乱の一部です。すぐに変わることはありません。とはいえ、私が考えたことを皆さんが確認してくれてうれしいです。これは、それだけでは不可能なはずだということです。

私は同等のコードを持っています:

typedef std::vector<Widget*> widget_vector_t;

typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

次に、クラスにWIDGET_STRUCTメンバーがあります。

WIDGET_STRUCT widgets_;

いくつかのメンバーメソッドの本文で、これが表示されます...これ... THING

Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];

明確にするために、これはウィジェットポインターのベクトルをウィジェットポインターに割り当てていることを理解しています。

そしてそれは動作します。

STLベクトルは、ベクトルの最初の要素を返すキャスト演算子または何かを提供しますか?

4

3 に答える 3

5

私はそれを理解しました、そして私は恥ずかしいです。

実際のコードには、恐ろしい名前の typedef が大量に山積みされ、キャメル ケースに入れられ、短縮されており、すべてが 1 か所にあり、フォーマットも不十分です。言うまでもなく、読むのは難しいし、すべての名前は非常に似ています.

構造体の型は、実際にはポインタの配列です。「Widget *」は、Widget ポインタのベクトルに非常によく似た名前で型定義されています。

コードは完全に正常に動作し、既存のコード ベースは山積みであり、問​​題は最終的に椅子とキーボードの間にあります。

遊んでくれてありがとう。

于 2012-10-24T16:56:54.773 に答える
1

それは単純な誤解です。

以下のベクトルの定義:

vector<int*> a[10];

(10-size, int*-type) ベクトルを定義するという意味ではありません。代わりに、(10-size, vector<int*>-type)array;

STL ベクトルは、キャスト演算子またはベクトルの最初の要素を返す何かを提供しますか?

関連するのは、要素タイプのポインターを返す配列です。

int* b[10];

それから

int** ptrb = b;

合法です。

于 2012-10-24T17:23:20.533 に答える
0

直接の質問に答えるには:

STL ベクトルは、キャスト演算子またはベクトルの最初の要素を返す何かを提供しますか?

いいえ。このコードはコンパイルできません:

#include <vector>
using namespace std;

class Widget {};

typedef std::vector<Widget*> widget_vector_t;

static const size_t SOME_SIZE_CONSTANT = 10;
static const size_t SOME_INDEX_CONSTANT = 0;
typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

int main()
{
    WIDGET_STRUCT widgets_;
    Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];
}

コンパイラは、 avector<Widget*>と a の間で変換しようとしてWidget*いるが、そのような変換は利用できないと警告します。

直接的ではない質問に答えるには:

私は何を見ていますか?

あなたが私たちに示していない何か他のことがここで起こっているに違いありません。1つの理論がありますが、それは単なる理論です。

実際のコードでは、 ではなく、実際にwidget_array_typedef vector<Widget*>のサブクラスでvectorあり、変換演算子が提供されている可能性があります。例えば:

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;

class Widget {};

class widget_vector_t : public std::vector<Widget*>
{
public:
    operator Widget* () 
    {
        return front();
    }
};

static const size_t SOME_SIZE_CONSTANT = 10;
static const size_t SOME_INDEX_CONSTANT = 0;
typedef struct
{
    widget_vector_t widget_array_[SOME_SIZE_CONSTANT];
} WIDGET_STRUCT;

int main()
{
    WIDGET_STRUCT widgets_;
    Widget *p = widgets_.widget_array_[SOME_INDEX_CONSTANT];
}

これコンパイルされます - それは合法であり、私が知る限り、正当なコードです。これも恐ろしくひどいコードですが、あなたはすでにそれを知っていると思います。

于 2012-10-24T16:31:43.767 に答える