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;在标题中这样做,我不必在实际源代码中初始化或调用某些东西来使其工作。向量本身工作得很好,我只想知道是否有办法从原始全局结构的修改版本构建它。比如说,我想使用相同的全局结构,但成员的值不同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 回答