Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedef使用不同的类型名称更改值名称_C++_Struct_Typedef - Fatal编程技术网

C++ typedef使用不同的类型名称更改值名称

C++ typedef使用不同的类型名称更改值名称,c++,struct,typedef,C++,Struct,Typedef,如果我有: typedef struct Foo { int x, y; } Point, SomethingElse; 我希望Foo.x等于Point.x,但我希望SomethingElse.a也等于Point.x,或者换句话说,我希望SomethingElse与Foo和Point完全相同,但它的两个变量命名为其他东西。如果我必须创建一个全新的结构,那似乎是一种浪费。您有3个不同的typedef,它们是在一个语句中声明的相同结构SomethingElse没有名为a的成员 也可能您想要

如果我有:

typedef struct Foo {
    int x, y;
} Point, SomethingElse;

我希望
Foo.x
等于
Point.x
,但我希望
SomethingElse.a
也等于
Point.x
,或者换句话说,我希望
SomethingElse
Foo
Point
完全相同,但它的两个变量命名为其他东西。如果我必须创建一个全新的结构,那似乎是一种浪费。

您有3个不同的typedef,它们是在一个语句中声明的相同结构
SomethingElse
没有名为
a
的成员


也可能您想要一个
typedef联合

您有3个不同的typedef,它们是在一个语句中声明的相同结构
SomethingElse
没有名为
a
的成员


另外,您可能需要一个
typedef联合

如果不要求为不同的类型强制使用不同的变量名,那么使用联合如何

typedef struct Foo
{
    union
    {
        int a;
        int x;
    };
    union
    {
        int b;
        int y;
    };
} Point, SomethingElse;

如果不要求为不同类型强制使用不同的变量名,那么使用联合如何

typedef struct Foo
{
    union
    {
        int a;
        int x;
    };
    union
    {
        int b;
        int y;
    };
} Point, SomethingElse;

相反,您可以将变量视为对象中的数组,并使用数组运算符使用具有所需名称的变量检索值

struct example{
  int data[2];
  int& operator[](int index){
    //range check index before lookup if desired
    return data[index];
  }
};

int X=0;
int Y=1;
int A=0;
int B=1;

typedef example Point;
typedef example SomethingElse;


int main(int argc,char** argv){
  Point p;
  SomethingElse s;

  p[X]=0;

  s[A]=0;


  return 0;
}

这是一种方法,您可以像请求的那样执行操作,但我建议您要么在每个结构中声明具有所需名称的唯一结构,而不是尝试为结构中的变量名称提供别名。仅仅声明第二个结构似乎不那么麻烦。

您可以将变量视为对象中的数组,并使用数组运算符使用具有所需名称的变量检索值

struct example{
  int data[2];
  int& operator[](int index){
    //range check index before lookup if desired
    return data[index];
  }
};

int X=0;
int Y=1;
int A=0;
int B=1;

typedef example Point;
typedef example SomethingElse;


int main(int argc,char** argv){
  Point p;
  SomethingElse s;

  p[X]=0;

  s[A]=0;


  return 0;
}

这是一种方法,您可以像请求的那样执行操作,但我建议您要么在每个结构中声明具有所需名称的唯一结构,而不是尝试为结构中的变量名称提供别名。仅仅声明第二个结构似乎不那么麻烦。

您应该有两个结构IMHO。或者添加第三个变量a。但说实话,我不确定你想达到什么目的。有任何示例代码吗?@AndrewTruckle我的设置与问题中的设置基本相同,只不过还有一个向量(大小/方向类型),使用x和y会让人感到困惑,并且使结构感觉编辑错误:哦,它们也是浮动,但这不应该。matterI会对人们提出的想法感兴趣。如果变量是不同的类型和名称,我看不出你怎么做。你可能可以强制转换为union(这是标准布局类型的commoninitial序列所允许的),虽然这是一个糟糕的想法,但实际上你应该有两个结构IMHO。或者添加第三个变量a。但说实话,我不确定你想达到什么目的。有任何示例代码吗?@AndrewTruckle我的设置与问题中的设置基本相同,只不过还有一个向量(大小/方向类型),使用x和y会让人感到困惑,并且使结构感觉编辑错误:哦,它们也是浮动,但这不应该。matterI会对人们提出的想法感兴趣。如果变量是不同的类型和名称,我看不出你可以怎么做。你可能可以强制转换为union(这是标准布局类型的commoninitial序列所允许的),尽管这是一个可怕的想法,但实际上如果用户向x写入,然后从a读取,这可能会导致未定义的行为。我不记得标准在本例中到底说了什么,因为a&x是同一类型的,但我的理解是,在一个联合中写入一个变量并从另一个变量读取是未定义的行为。这假定有人会这样做,但是设计确实会在ISOC++中留下这是UB(联盟有一个例外,即共享一个具有共同初始序列的结构,但是<代码> int A < /COD>不是结构),这很好,我忘记了联盟甚至存在。但是有没有什么方法可以阻止人们做
Point.a
SomethingElse.x
?如果用户先向x写,然后从a读,这可能会导致未定义的行为。我不记得标准在本例中到底说了什么,因为a&x是同一类型的,但我的理解是,在一个联合中写入一个变量并从另一个变量读取是未定义的行为。这假定有人会这样做,但是设计确实会在ISOC++中留下这是UB(联盟有一个例外,即共享一个具有共同初始序列的结构,但是<代码> int A < /COD>不是结构),这很好,我忘记了联盟甚至存在。但是我有没有办法阻止人们做点什么呢?我同意。做第二个结构!我同意。做第二个结构!