我想知道我是否可以创建一个结构数组,然后在foreach循环中使用它。
struct A { int a; };
struct B { int b; };
struct C { float c; };
然后:
int main()
{
A a; B b; C c;
//Here I want to make an array of a, b and c,
//then use it in for loop with the ints and floats.
}`
答案 0 :(得分:2)
您无法安全地在C ++中创建一组不相关的类型。
如果您需要将对象放在容器中,那么它们可能有些相关:您应该考虑向A
,B
和C
添加公共基类,然后操纵(智能)基类指针的数组(或vector
...)。
但是,考虑一下定义封装结构的类型的可能替代方案,而不是声明这个“数组”:
struct T {
A obj1;
B obj2;
C obj3;
};
注意:
boost::any
或boost::variant
非常便于封装对象或任何类型。答案 1 :(得分:1)
当然可以,但是如果不使用外部库,就不能创建一组不相关的类型/结构:
#include <iostream>
struct Person
{
std::string name;
int age;
std::string job;
};
int main()
{
Person people[10];
//I am a normal one.
for(int i=0; i<10; ++i)
{
people[i].name = "usar";
people[i].age = i;
people[i].job = "Astronaut";
}
//foreach loop
for(Person p: people)
{
std::cout << "Name: "<< p.name << "\n";
std::cout << "Age: "<< p.age << "\n";
std::cout << "Job: "<< p.job << "\n";
}
return 0;
}
答案 2 :(得分:0)
是的,只需像其他类型一样创建它。假设我们有Car的结构
struct Car
{
int engine;
string brandName;
};
您可以像
一样创建它Car list[2]={{3000, "BMW"},{2200, "Mercedes-Benz"}};
或只是
Car list[2];
答案 3 :(得分:0)
如果你想拥有不同类型的“数组”,那么在技术上它在C ++中是可行的,虽然不是很简单。至少不适合新手C ++程序员。首先,您需要使用非平凡的数据类型,如boost::variant
或std::tuple
,第二 - 访问该数据将需要模板元编程,这对初学者来说也不容易。但很可能你的问题有更简单的解决方案,可以更容易地解决,你只是在寻找错误的方向。
答案 4 :(得分:0)
struct Base
{
virtual ~Base(){}
virtual int GetInt()
{
throw "Not implemented";
return 0;
}
virtual float GetFloat()
{
throw "Not implemented";
return 0.0f;
};
};
struct A : public Base
{
int a;
virtual int GetInt()
{
return a;
}
};
struct B : public Base
{
int b;
virtual int GetInt()
{
return b;
}
};
struct C : public Base
{
float c;
virtual float GetFloat()
{
return c;
}
};
int main()
{
A a; B b; C c;
Base* array[ 3 ] = { &a, &b, &c };
}