Tag: 结构

隐藏C结构中的成员

我一直在阅读关于面向对象的C语言,但是我从来不喜欢在C ++中不能拥有私人数据成员。 但后来我想到你可以创build2个结构。 一个在头文件中定义,另一个在源文件中定义。 // ========================================= // in somestruct.h typedef struct { int _public_member; } SomeStruct; // ========================================= // in somestruct.c #include "somestruct.h" typedef struct { int _public_member; int _private_member; } SomeStructSource; SomeStruct *SomeStruct_Create() { SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource)); p->_private_member = 42; return (SomeStruct *)p; } 从这里你可以把一个结构投给另一个。 这被认为是不好的做法? 还是经常做?

公共只读字段用于不可变的结构是否工作?

这是一个正确的方式来声明不可变的结构? public struct Pair { public readonly int x; public readonly int y; // Constructor and stuff } 我想不出为什么会遇到问题,但我只是想问一下。 在这个例子中,我使用了整数。 如果我使用了一个类,但是这个类也是不可变的,像这样呢? 那应该也可以,对不对? public struct Pair { public readonly (immutableClass) x; public readonly (immutableClass) y; // Constructor and stuff } (另外:我明白,使用属性是更通用的,并允许更改,但是这个结构的意图只是存储两个值,我只是对这个不变性问题感兴趣。

在一个结构中,使用一个数组字段访问另一个数组是合法的吗?

例如,考虑以下结构: struct S { int a[4]; int b[4]; } s; 写sa[6] ,期望它等于sb[2]是合法的吗? 就我个人而言,我觉得它必须是C ++的UB,而我不确定C的含义。然而,我没有发现任何与C和C ++语言标准相关的东西。 更新 有几个答案build议如何确保字段之间没有填充,以使代码可靠地工作。 我想强调的是,如果这样的代码是UB,那么填充的缺乏是不够的。 如果是UB,那么编译器可以自由地假定对Sa[i]和Sb[j]不重叠,并且编译器可以自由地对这样的存储器访问进行重新sorting。 例如, int x = sb[2]; sa[6] = 2; return x; 可以转化为 sa[6] = 2; int x = sb[2]; return x; 总是返回2 。

C中的结构inheritance

我可以inheritanceC中的结构吗? 如果是的话,怎么样?

C ++:一个结构可以inheritance一个类吗?

我正在查看我正在使用的API的实现。 我注意到一个结构是从一个类inheritance,我暂停了思考它… 首先,我没有看到在我研究的C ++手册中,一个结构体可以从另一个结构体inheritance: struct A {}; struct B : public A {}; 我猜在这种情况下,struct Binheritance了stuct中的所有数据。我们可以在一个struct中声明public / private成员吗? 但是我注意到这个: class A {}; struct B : public A {}; 从我的在线C ++手册: 一个类是一个数据结构的扩展概念:它不仅保存数据,而且可以保存数据和函数。 即使类A有一些成员函数,上述inheritance是否有效? 当一个结构体inheritance它们的时候会发生什么? 那么相反呢:一个类从一个结构inheritance? 实际上,我有这个: struct user_messages { std::list<std::string> messages; }; 我用它来遍历它,就像这个foreach message in user_messages.messages 。 如果我想添加成员函数到我的结构,我可以改变它的声明和“提升”到一个类,添加function,仍然像我以前一样迭代我的user_messages.messages? 显然,我还是一个新手,我还不清楚结构和类如何相互作用,两者之间的实际区别是什么,inheritance规则是什么…

关键字“new”对C#中的结构做了什么?

在C#中,Structs是按照值来pipe理的,对象是在引用中。 根据我的理解,当创build一个类的实例时,关键字new导致C#使用类信息来创build实例,如下所示: class MyClass { … } MyClass mc = new MyClass(); 对于结构,你不是创build一个对象,而是简单地将一个variables设置为一个值: struct MyStruct { public string name; } MyStruct ms; //MyStruct ms = new MyStruct(); ms.name = "donkey"; 我不明白的是,如果通过MyStruct ms = new MyStruct()声明variables,那么关键字new在这里对语句做了什么? 。 如果struct不能成为一个对象,那么这里实例化的new东西是什么?

这个错误是什么意思:“错误:在'type_name'之前预期说明符 – 限定符列表”?

我一直在处理单元处理器,我试图创build一个结构,将持有一个spe_context_ptr_t ,将用于线程内启动一个spe上下文,还将持有一个指向其他东西,将被传递给从线程内的spu上下文(目前我试图只是把它作为一个通用的指针,但实际上它将是一个指向我定义的另一个结构的指针)。 当我尝试编译时,出现以下错误: spu/../common.h:38: error: expected specifier-qualifier-list before 'spe_context_ptr_t' // here is the offending line(s) typedef struct _PTHREAD_BLOCK { spe_context_ptr_t * context; // Error happens here uintptr32_t args; } PTHREAD_BLOCK;

结构向量的初始化

我想知道如何使用push_back方法将值添加到结构向量中 struct subject { string name; int marks; int credits; }; vector<subject> sub; 那么现在如何添加元素呢? 我有函数初始化string名称(主题名称) void setName(string s1, string s2, …… string s6) { // how can i set name too sub[0].name= "english", sub[1].name = "math" etc sub[0].name = s1 // gives segmentation fault; so how do I use push_back method? sub.name.push_back(s1); sub.name.push_back(s2); sub.name.push_back(s3); sub.name.push_back(s4); […]

更改结构列表中元素的值

我有一个结构列表,我想改变一个元素。 例如 : MyList.Add(new MyStruct("john"); MyList.Add(new MyStruct("peter"); 现在我想改变一个元素: MyList[1].Name = "bob" 但是,每当我尝试这样做,我得到以下错误: 无法修改System.Collections.Generic.List.this [int]的返回值,因为它不是一个variables 如果我使用类的列表,问题不会发生。 我想答案与结构是一种价值types有关。 所以,如果我有一个结构列表,我应该把它们看作是只读的吗? 如果我需要更改列表中的元素,那么我应该使用类而不是结构?

需要在结构中重写什么以确保平等运行正常?

正如标题所说:我是否需要重写==运算符? 那么.Equals()方法呢? 任何我失踪?