C++类定义中创建Ship对象时出现Expected type specifier错误
问题原因及解决办法
错误原因
在C++类的成员声明中,Ship smallShip1(2);这种带括号的写法会被编译器误判为成员函数声明(试图声明一个返回Ship类型、名为smallShip1、参数为int类型的函数),而非对象初始化,因此触发"Expected type specifier"编译错误。而函数体内的局部变量初始化不存在这种歧义,所以普通函数中可以正常创建Ship对象。
解决办法
方法1:使用统一初始化语法(C++11及以上)
将括号替换为大括号{},明确告诉编译器这是对象初始化:
class Player{ private: //0 = blank //1 = hit //miss = 2 Ship smallShip1{2}; Ship smallShip2{2}; Ship bigShip{3}; int screenStateArray[5][5] ={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}; public: void displayScreen(); void placeShip(); };
方法2:通过构造函数初始化列表初始化
先在类中声明Ship成员变量,再在Player的构造函数中使用初始化列表完成初始化:
第一步:修改Player类声明
class Player{ private: //0 = blank //1 = hit //miss = 2 Ship smallShip1; Ship smallShip2; Ship bigShip; int screenStateArray[5][5] ={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}; public: Player(); // 声明构造函数 void displayScreen(); void placeShip(); };
第二步:实现Player构造函数
Player::Player() : smallShip1(2), smallShip2(2), bigShip(3) // 初始化列表 {}
额外注意
确保Ship类的定义出现在Player类之前,否则需要在Player类前添加Ship的前向声明(但你的场景中普通函数能正常创建Ship对象,说明Ship的定义已经正确前置,无需额外处理)。
内容的提问来源于stack exchange,提问作者bob in the bin
相关产品推荐
相关产品推荐

