C++ 不允许使用不完整的类型(指针)
我有一个大学问题,它要求如下(结构已经由老师给出):C++ 不允许使用不完整的类型(指针),c++,pointers,struct,C++,Pointers,Struct,我有一个大学问题,它要求如下(结构已经由老师给出): 编写一个函数空缺读日期(日期*d),按年/月/日的格式从键盘读取日期。为了简单起见,考虑用户总是输入有效日期。“ 问题本身很简单,我不明白的是为什么函数会给出错误(第7行-“不允许不完整类型”和“标识符d未定义”),我不明白这是老师的错误还是我的错误,因为“void readDate(Date*d)”是他给出的 #include <iostream> #include <string> using namespace
编写一个函数空缺读日期(日期*d),按年/月/日的格式从键盘读取日期。为了简单起见,考虑用户总是输入有效日期。“
问题本身很简单,我不明白的是为什么函数会给出错误(第7行-“不允许不完整类型”和“标识符d未定义”),我不明白这是老师的错误还是我的错误,因为“void readDate(Date*d)”是他给出的#include <iostream>
#include <string>
using namespace std;
struct Date{
unsigned int year, month, day;
} Date;
void readDate( Date* d) {
string date;
size_t index;
getline(cin, date); //for simplicity, user input is considered to be always valid
d->year = stoi(date.substr(0, 3));
d->month = stoi(date.substr(5, 6));
d->day = stoi(date.substr(8, 9));
}
int main()
{
struct Date* ptr = &Date;
realDate(ptr);
return 0;
}
#包括
#包括
使用名称空间std;
结构日期{
未签名整数年、月、日;
}日期;
无效读取日期(日期*d){
字符串日期;
尺寸指数;
getline(cin,date);//为了简单起见,用户输入被认为总是有效的
d->year=stoi(日期substr(0,3));
d->month=stoi(日期,substr(5,6));
d->day=stoi(date.substr(8,9));
}
int main()
{
结构日期*ptr=&Date;
重新分配日期(ptr);
返回0;
}
当前代码:
结构日期{//(1)
未签名整数年、月、日;
}日期;/(2)
在(1)处创建名为Date
的结构(类型),并在(2)处创建名为Date
的该结构的实例。该结构的实例将使用相同名称对该类型进行阴影处理,这就是导致此问题的原因
从外观上看,实际上不需要全局定义Date
实例。您应该能够将实例移动到main
,这将其更改为:
结构日期{
未签名整数年、月、日;
};
...
int main()
{
日期;
Date*ptr=&Date;//您甚至可以避免此步骤,直接执行readDate(&Date)
读取日期(ptr);
...
}
否则,代码:
void readDate(日期*d){
将标识符Date
视为类型Date
的一个实例,而不是类型Date
本身——这会导致像您所经历的那样令人困惑的错误
如果需要全局定义Date
实例,则理想情况下,您应该为其指定一个与类型不同的名称(例如struct Date{…}Date;)
。如果不可能,则必须在该类型的所有使用前面加上struct
,以消除歧义,如:
void readDate(结构日期*d){
如果教授给您的代码具有:
struct Date {
...
} Date;
void readDate(Date* d) {
...
}
那么他们一定给了你坏代码,因为——正如我上面所描述的——如果没有一些代码更改,这不是合法代码。将“struct Date{…}Date”
重写为
typedef struct _Date
{
...
} Date;
...
Date date;
为对象
Date
使用与类型Date
不同的名称,或者在表示类型的任何位置写入struct Date
,在表示对象的位置写入普通的Date
(如果由于某种原因,无法将其更改为具有不同的名称)卢西斯:这个问题有两个答案。如果有人回答你的问题让你满意,请记住接受这个答案。否则,考虑留下一个评论的答案,以帮助提供反馈,为什么答案不被接受。(我通常不会对此发表评论,但我从你的帖子记录中注意到,问题似乎没有被接受的答案)结构日期的问题{…日期:是不是无效C++。Prof需要停止C++中的C语言教学。我完全同意。但是OP实际上没有明确说明< <代码>日期>代码>结构是否被赋予了<代码>日期<代码>实例,名为“代码>日期<代码>,或者是否是自己的添加。如果教授给出了函数的形式<代码>空缺读写器。ate(日期*d),我的假设是OP添加了<代码>日期>代码>实例。由于这个问题是C++的标记,如果OP能够修改<代码>结构日期< /代码>定义,最好将“<代码>日期>代码>实例从构造中删除,而不是将它改为<代码> TyPulfF。是C++样式的模式,它在C++中没有任何用途,因为所有类型标识符总是被添加到封闭的命名空间中(C,<代码> TyPulf结构……/COD>需要从标识符命名空间中引入标识符到标识符命名空间)。