3

グローバル構造体のリストを取得し、同じヘッダー ファイル内から変更されたバージョンを含むベクターを初期化する方法はありますか? .h ファイルはランタイム コードではないため、変数に直接アクセスして編集できないことはわかっていますが、たまたまこれに対する回避策がある可能性があります。 C++ 初心者向けマニュアル.. もしそうなら、私を許してください!

例を作るために、いくつかのメンバーを理解する構造体があり、.h ファイルでいくつかのグローバルなものを宣言したとしましょう..

struct MyStruct
{
  unsigned int a;
  string foo;
  float myfloat;
};

MyStruct struct_one={1,"hello",0.238f};
MyStruct struct_two={10,"salve",3.14f};
MyStruct struct_three={3,"bonjour",0.001f};
MyStruct struct_four={6,"dias",5.0f};

次に、それらを含むベクターをこの方法で初期化できます (ただし、それが最適かどうかはわかりません)。

MyStruct MyStructArray[] = {struct_one, struct_two, struct_three, struct_four};

vector<MyStruct> MyStructVector(MyStructArray,
MyStructArray+sizeof(MyStructArray)/sizeof(MyStructArray[0]));

しかし、グローバルなものを変更せずに、ベクター (または配列) を作成する前に、その場で一部の構造体のメンバーを変更できるようにしたいと考えています。可能?

編集:「ヘッダーファイル内」とは、「ヘッダーファイル内」を意味しました。ヘッダーで行う場合unsigned int a = 100;、実際のソースで何かを初期化または呼び出して動作させる必要はありません。ベクトル自体は完全に機能します。元のグローバル構造体の変更されたバージョンからそれを構築する方法があるかどうかを知りたかっただけです..たとえば、同じグローバル構造体を使用したいが、 member の値が異なりますa

4

2 に答える 2

2

@Samの答えに加えて...

コンストラクターを使用します。

struct MyStruct {
    unsigned int a;
    string foo;
    float myfloat;

    MyStruct(unsigned int a, const string& foo, float myfloat) : a(a) , foo(foo), myfloat(myfloat) {}
};

これで、単純なステートメントで構造体をベクターに追加できます

vec.push_back(MyStruct(1, "hello", 0.238f));

class Foo {
public:
    static std::vector<int> MyStructVector;
}

inline std::vector<MyStruct> MakeVector()
{
    std::vector vec;
    vec.push_back(MyStruct(1, "hello", 0.238f));
    //...
    return vec;
}

std::vector<MyStruct> Foo::MyStructVector= MakeVector();
于 2013-08-17T17:44:38.133 に答える
0

あなたの質問が正しいかどうかわかりません:

#include <vector>
#include <iostream>

// Header
// ======

struct MyStruct
{
  unsigned int a;
  std::string foo;
  float myfloat;

  MyStruct(unsigned a, const std::string& foo, float myfloat)
  : a(a), foo(foo), myfloat(myfloat)
  {}
};

typedef std::vector<MyStruct> MyStructs;

extern MyStructs& get_structs();

struct AppendToMyGlobalMyStruct {
    AppendToMyGlobalMyStruct(unsigned a, const std::string& foo, float myfloat) {
        get_structs().push_back(MyStruct(a, foo, myfloat));
    }
};


// Source
// ======

// Have initialization done at first function call, only:
MyStructs& get_structs() {
    static MyStructs s;
    return s;
}

// Another source
AppendToMyGlobalMyStruct a(0, "0", 0);
// Another source
AppendToMyGlobalMyStruct b(1, "1", 1);
// Another source
AppendToMyGlobalMyStruct c(2, "2", 2);

int main()
{
    MyStructs& s = get_structs();
    std::cout << s[0].foo << std::endl;
    std::cout << s[1].foo << std::endl;
    std::cout << s[2].foo << std::endl;
    return 0;
}

(私の名前はばかげています)

于 2013-08-17T18:00:20.637 に答える