是否可以有一个包含对结构的引用的结构。这些如何初始化?见下面的简短示例。
由于
typedef struct {
int a;
}typeInner1;
typedef struct {
int b;
}typeInner2;
typedef struct {
typeInner1 &one;
typeInner2 &two;
}typeOuter;
void fun2(typeOuter *p){
p->one.a =2;
p->two.b =3;
}
void fun(typeInner1 &arg1,typeInner2 &arg2){
typeOuter *ptr = new typeOuter;//<-- how to write initializer
fun2(ptr);
}
int main(){
typeInner1 arg1;
typeInner2 arg2;
fun(arg1,arg2);
//now arg1.a should be 2 and arg2.a=3
}
好的,谢谢你的所有输入。我还必须修改typeOuter的typedef才能使它工作。以下完整的工作代码供其他人查找此帖子。
#include <cstdio>
typedef struct {
int a;
}typeInner1;
typedef struct {
int b;
}typeInner2;
typedef struct typeOuter_t {
typeInner1 &one;
typeInner2 &two;
typeOuter_t(typeInner1 &a1, typeInner2 &a2) : one(a1), two(a2) {}
}typeOuter;
void fun2(typeOuter *p){
p->one.a =2;
p->two.b =3;
}
void fun(typeInner1 &arg1,typeInner2 &arg2){
typeOuter *ptr = new typeOuter(arg1,arg2);
fun2(ptr);
}
int main(){
typeInner1 arg1;
typeInner2 arg2;
fun(arg1,arg2);
//now arg1.a shoule be 1 and arg2.a=3
fprintf(stderr,"arg1=%d arg2=%d\n",arg1.a,arg2.b);
}
答案 0 :(得分:3)
给typeOuter
一个合适的构造函数:
struct typeOuter
{
typeInner1 &one;
typeInner2 &two;
typeOuter(typeInner1 &a1, typeInner2 &a2) : one(a1), two(a2) {}
};
void fun(typeInner1 &arg1, typeInner2 &arg2) {
typeOuter *ptr = new typeOuter(arg1, arg2);
fun2(ptr);
}
答案 1 :(得分:3)
在C ++ 11之前,您需要构造函数typeOuter
,并初始化初始化列表中的成员引用:
typeOuter(typeInner1& i1, typeInner2& i2) : one(i1), two(i2) {}
使用C ++ 11,您还可以选择直接使用初始化列表(无需自己定义构造函数):
typeOuter *ptr = new typeOuter { arg1, arg2 };
答案 2 :(得分:2)
在C ++中,您可以为struct
创建构造函数。结构基本上是public
作为默认访问修饰符的类。
struct Example
{
// struct fields..
Example(); // initialize struct objects.
~Example(); // perform clean up if necessary.
};
答案 3 :(得分:1)
您的问题不是引用struct
,而是通常初始化引用。无论是引用struct
还是内置类型,引用都不能默认初始化。
int& x; // ERROR! Non-initialized reference to int
C& y; // ERROR! Non-initialized reference to a struct C
int z;
C w;
int& a = z; // OK: Initialized reference to int
C& b = w; // OK: Initialized reference to struct C
如果你的引用是struct
的成员变量,另一方面(无论它们引用什么类型),它们必须在struct
构建后立即绑定(就像常规一样)引用)。默认构造你的struct
然后绑定引用不是一个选项,因为它分两步完成,并且在第一步之后引用将是未初始化的。
因此,您必须为struct
提供构造函数并在那里初始化您的引用:
struct typeOuter {
typeOuter(typeInner1& o, typeInner2& t) : one(o), two(t) { }
typeInner1 &one;
typeInner2 &two;
};
您的fun()
功能将如下所示:
void fun(typeInner1 &arg1,typeInner2 &arg2){
typeOuter *ptr = new typeOuter(arg1, arg2);
fun2(ptr);
}
答案 4 :(得分:1)
您可以添加构造函数,但也可以使用聚合初始化和工厂函数。这适用于所有版本的C ++:
struct A
{
int& i;
};
A make_a(int& i)
{
A a = {i};
return a;
}
int main()
{
int i = 0;
A* a = new A(make_a(i));
}
答案 5 :(得分:0)
嗯..
#include <cstdio>
struct typeInner1
{
typeInner1(int a = 0) : m_a(a) {} // typeInner1 constructor
int m_a;
};
struct typeInner2
{
typeInner2(int b = 0) : m_b(b) {} // typeInner2 constructor
int m_b;
};
struct typeOuter
{
typeOuter(typeInner1& one, typeInner2& two) : m_one(one), m_two(two) {} // typeOuter constructor
typeOuter& set(int a, int b) { m_one.m_a = a; m_two.m_b = b; return *this; }
typeOuter& print() { printf("typeInner1 a is %i and typeInner2 b is %i\n", m_one.m_a, m_two.m_b); return *this; }
typeInner1& m_one;
typeInner2& m_two;
};
typeOuter fun(typeInner1& arg1, typeInner2& arg2)
{
return typeOuter(arg1, arg2);
}
int main()
{
typeInner1 arg1;
typeInner2 arg2;
fun(arg1, arg2).print().set(101, 202).print().set(202, 303).print();
return 0;
}
输出
typeInner1 a is 0 and typeInner2 b is 0
typeInner1 a is 101 and typeInner2 b is 202
typeInner1 a is 202 and typeInner2 b is 303