在代码中的一些地方,我有一个struct
定义,如下所示:
typedef struct tagNameOfStruct{
//some methods and members
}T_NameOfStruct, * PT_NameOfStruct, FAR LPT_NameOfStruct;
typedef struct tagNameOfStructLists{
//some methods and members
}T_NameOfStructLists, * PT_NameOfStructLists, FAR LPT_NameOfStructLists;
typedef pair<T_NameOfStruct, T_NameOfStructLists> CStructPair;
typedef map<T_NameOfStruct, T_NameOfStructLists> CStructMap;
我在循环中的方法内看到以下代码行
T_NameOfStruct instance;
T_NameOfStructLists listInstance;
m_MapInstance.insert(CStructPair(instance, listInstance));
//structMapInstance is a members of method class of type CStructMap
该实例正被插入到在函数范围之外使用的数据结构中。它通过引用传递给数据结构。
编辑 ----为什么这不重复,请重新开启---- : 结构定义中的* PT_NameOfStruct,FAR LPT_NameOfStruct与您链接的问题不同。还有一个问题是,当它在方法堆栈上定义时,通过ref传递实例。奇怪的是代码工作,所以我想知道我在这里缺少什么。为什么我在尝试访问迭代数据结构的不同函数中的被破坏对象时不会出现异常。 仍然认为这是重复的?
答案 0 :(得分:2)
当我们离开函数范围时,实例不应该死吗?
是。如果您之前没有向我们展示的代码实际上使用了对它的引用,那么它就错了。但由于我们无法看到它,我们只能猜测它是否会这样做。
更新:现在您已经向我们展示了实际发生的情况,它被传递给map::insert
,它存储了其参数的副本(即使它通过引用获取参数)。当instance
本身被破坏时,没有问题,假设它具有有效的复制语义。
结构定义的结尾是什么意思?
宣布:
tagNameOfStruct
的课程。T_NameOfStruct
。在C ++中,这完全没有意义;在C语言中,有些人习惯这样做,以避免在指定类型时键入struct
。PT_NameOfStruct
。这比第一个typedef更糟糕,因为它隐藏了某些东西是指针的重要信息。LPT_NameOfStruct
。这是16位平台的宿醉;在现代平台上,它将与常规指针类型相同。不要将其用作如何声明类类型的模型。最好保持简单:
class NameOfStruct { // or "struct", if you want members to be public by default
// members
};
NameOfStruct instance; // No need for a typedef
NameOfStruct * pointer; // Make it clear that it's a pointer
答案 1 :(得分:1)
struct tagNameOfStruct {
在C ++中,struct标签具有与typedef等效的状态。在C中不是这样。
T_NameOfStruct
这是tagNameOfStruct
的另一个更好的名称。
* PT_NameOfStruct
这是指针到NameOfStruct
的typedef。
FAR LPT_NameOfStruct;
对于指向NameOfStruct
的FAR指针,这是一个过时的名称,因为near
和far
指针自Windows 95以来就意味着同样的事情。请注意,这是因为前面的typename中的前面的*
,由于C的奇怪指针语法而延续到这一个。
这里唯一需要担心的是NameOfStruct
,它是结构本身的typedef,而PT_NameOfStruct
是指向它的指针。其余的都是绒毛。
该实例正被插入到在函数范围之外使用的数据结构中。它通过引用传递给数据结构。
当我们离开函数范围时,实例不应该死吗?
是。你发现了一个错误。
结构定义的结尾是什么意思?
'结构定义的结尾'意味着这是结构定义的结尾。还有什么意思?你的意思是声明的结尾吗?你的意思是我上面所说的一切吗?
答案 2 :(得分:0)
除上述答案外,
struct s
{
}
在上面的结构定义中,您可以使用如下
在c中声明实例你应该这样做
struct s instance1;
在c ++中你应该定义如下
struct s instance1; (or)
s instance1;
两者在c ++中都有效。
在c中,不是在所有区域都使用struct,你可以使用typedef进行简化。