【发布时间】: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 关于近距离投票的问题。这是一个简单的技术问题。