类内的结构[关闭]

Posted

技术标签:

【中文标题】类内的结构[关闭]【英文标题】:structs inside classes [closed] 【发布时间】:2012-12-27 04:12:55 【问题描述】:

我对将结构作为类成员的语法有些疑问。

我有这个结构:

/*  POS.H   */
#ifndef POS_H
#define POS_H
struct pos
    int x;
    int y;

    pos operator=(const pos& a)
        x=a.x;  y=a.y;
        return a;
    

    pos operator+(const pos& a)const 
        return (pos)a.x+x,a.y+y;
    

    bool operator==(const pos& a)const 
        return (a.x==x && a.y== y);
    
;
#endif /* POS_H */

在另一个文件中有主要功能:

/* MAIN.CPP */
#include "pos.h"
#include "clase.h"
int main()
    pos pos;
    pos.x=0;
    pos.y=0;
    clase clase();

那么包含class clase的文件clase.h有3个不同的内容。

这编译得很好:

#include "pos.h"
class clase
    private:
        pos posi;
    public:
        clase(pos pos):posi(pos);
;

这不会编译(只是更改成员的名称):

#include "pos.h"
class clase
    private:
        pos pos;
    public:
        clase(pos pos):pos(pos);

这也编译得很好(使用 pos 作为 neme 但使用关键字 struct):

#include "pos.h"
class clase
    private:
        struct pos pos;
    public:
        clase(struct pos pos):pos(pos);
;

我的问题是:为什么这些代码编译或不编译?

【问题讨论】:

因为成员的名字和类型相同(都是pos)。那是行不通的。 这不是你想的那样clase clase(); 这是一个函数的前向声明。你的意思可能是clase clase; 关闭投票者:答案可能没有太大的实用价值,但它仍然是一个关于语言规则的简单客观问题,任何从事编译器、重构工具等工作的人都需要研究. 作为旁注。我个人使用命名约定,因此很容易从变量/函数中发现类型。这也有助于解决这种类型的困惑。 @BenVoigt +1 关于近距离投票的问题。这是一个简单的技术问题。 【参考方案1】:

传统上,将成员命名为与结构名称相同的编码习惯并不好,看起来当您尝试声明名为 pos 的私有成员时编译器会感到困惑,除非您强制执行结构类型。

简而言之,这只是命名冲突,您应该养成命名成员与结构或对象名称略有不同的习惯。也许在 TitleCase 中命名您的结构和对象,然后在您的成员上使用 camelCasing。在此示例中,将结构命名为 POS,然后在私有类中:POS mPos;

【讨论】:

好的,但奇怪的是编译器允许主函数中的结构和变量具有相同的名称,而在它是类成员的情况下则不允许 很抱歉,我不知道为什么会出现问题,但有时确实会出现问题。我并不是要强制“照我说的做”的答案,但使用编码约定只是一个更好的主意,它会以某种方式使成员命名和结构/对象命名总是不同,以防止遇到这个问题第一名。

以上是关于类内的结构[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用装饰器的类内的函数包装器

如何对类内的结构进行快捷方式/绑定? (斯威夫特用户界面)

无法在类内第二次设置字符串类型[关闭]

关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。

使用类内的类提升进程间共享内存

类内的吸气剂模式?