需要修正一个语法错误,一个逻辑错误。
#include <stdio.h>#include <雹裂string.h>
int main()
{
携肆哪char max[20], str[3][20]
int i
printf("输入三个字符串:\n")
for (i=0 i<辩码3 i++)
gets(str[i]) // str 的类型是char[2][20],需要改成str[i]
if (strcmp(str[0], str[1]) > 0)
strcpy(max, str[0])
else
strcpy(max, str[1])
if (strcmp(str[2], max) > 0) // 只有str[2]大于max才进行复制
strcpy(max, str[2])
printf("三个字符串中的最大串为%s\n", max)
return 0
}
你好,我也正好在学这个问题,下面我的分析和解决方案。
你的代码里存在两个问题,第一个问题的本质是vector类的初始化问题,第二个问题的本质是两个类的声明定义顺序问题。第二个问题你并没有提出,但在一些编译器中会报错。
我先解决你的提出的问题,也就是第一个问题
std::vector<Screen>screens{ Screen(24, 80, ' ') }这句话最核心的部分编译器是则渗这么理解的:
vector<Screen>screens(Screen(24, 80, ' '))
即初始化一个vector对象screens,给的初始值是一个Screen类。那么,编译器首先会把给的Screen类转化为vector类,再赋值给screens。问题在于,我们定义的Screen类中并没有说明Screen类和vector类的转化关系,因此会报错。
但我们希望的是将给的Screen类作为screens的一个元素,故这里编译器没能理解我们的意图,如果你手头有《C++ primier 中文版第五版》的话,建议你看一下第87页关于vector类的初始化的内容,这页表格里的第二行是编译器的理解方式。如果我们要让编译器按我们的想法看问题,只用将代码修改为:
std::vector<Screen> screens{ 1,Screen(24, 80, ' ') }这样初始化过程编译器会理解为,将给定的Screen类作为vector对象screens的第一个元素来初始化screens,就不会报错了。
这样的修改是基于你使用的编译器不要求类声明顺序的情况,如果你看了我说的,在尝试的过程中出现了未定义类声明之类的错误,说明你这次使用的编译器要求声明顺序(我用VS2013默认的编译器就出现了问题)。那么你首先要解决我说的第二个问题。这时对程序的修改会有些不一样。
我在看到你的问题时,首先用你的代码试着编译(VS2013默认编译器)了一下,报错如下:
你的Window_mgr 类定义在类Screen 之后,但在Screen中又要声明Window_mgr中的clear成员函数作为友元。对于一些对声明顺序有强制要求的编译器,这是无法接受的。
因此,Window_mgr的定义应该在Screen之前,头文件中的开头部分代码修改为:
#include<iostream>#include<string>
#include<vector>
class Screen//先声明Screen类
class Window_mgr //再定义Window_mgr类
{
public:
using ScreenIndex =std::vector<Screen>::size_type
voidclear(ScreenIndex)
private:
std::vector<Screen>screens{ Screen(24, 80, ' ') }
}
class Screen//最后定义Screen类 {//这之后的代码不变
这样的修改参照了C++Primier中文版第五版 252页的意见。
再次编译,错误如下:
显然,改变定义顺序,虽然解决了前面提到的第一个错误孙薯脊,但是在Window_mgr定义时,Screen的构造函数还未定义,因此,对Window_mgr中screens数据成员的初始化最好使用构造函数。在Window_mgr中声明构造函数Window_mgr(),在头文件后面定义这一函数,这样的话头文件的代码是这样。
开头:
中间Screen部分不变,
结尾:
到这里,声明顺序的问题已经解决,然后关于vector类型初始化的问题只用把结尾这句修改为
真·结尾:
就可以了,这样修改的理由我在手扒最开始已经说明。
总的来说,你提出的问题的核心是关于vector类的初始化,这个问题你看我最开始几段就解决了,然后如果编译器严格要求声明顺序,那么你需要看完全部内容,才可以通过编译。
希望我的回答可以解决你的问题。
struct node *list(int c[P][Q],struct node*p1,struct stu[P][Q])你没有定义过名字段衡叫 stu 的握孝做结构慎胡体啊
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)