在头文件中初始化可自定义结构的向量

时间:2013-08-17 17:14:37

标签: c++ arrays struct

有没有办法获得全局结构列表并在同一个头文件中初始化包含它们的修改版本的向量? 我知道我不能直接访问和编辑.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;,则无需在实际源代码中初始化或调用某些内容即可使其正常工作。向量本身工作得很好,我只想知道是否有一种方法可以从原始全局结构的修改版本构建它。比方说,我想使用相同的全局结构,但成员{{1的值不同}}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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;
}

(与我的名字是愚蠢的)