C++将其他类对象传入类方法的声明方式及未声明报错解决
报错根因
你遇到的编译报错是类声明顺序导致的:C++编译器从上到下解析代码,定义Board类的draw方法时用到了Player类型作为参数,但此时Player类的完整定义还在后面,编译器无法识别Player这个类型,因此抛出未声明的错误。
修复方案
只需要在Board类定义前添加Player类的前置声明即可。由于你在draw方法中使用的是Player的引用参数,不需要知道Player类的内部结构,前置声明完全可以满足编译要求。
另外你的代码还有两处小问题会引发额外编译报错:
display和draw方法都缺失返回值声明,需要补充voiddraw方法中重复定义了变量i,需要删除多余的int声明
修复后的完整代码如下:
#include <iostream> #include <vector> // 添加Player类前置声明 class Player; class Board{ int sizeofboard; std::vector<std::vector<int>> board; public: Board(int sizeofboard){ this->sizeofboard = sizeofboard; int n = 1; for (int i = 0; i < sizeofboard; i++){ board.push_back(std::vector<int>()); for (int j = 0; j < sizeofboard; j++){ board[i].push_back(n); n++; } } } // 补充返回值void void display(){ for (int i = sizeofboard-1; i >= 0; i--){ std::cout << " "; for (int j = 0; j < sizeofboard; j++){ if (j == sizeofboard-1){ std::cout << board[i][j]; continue; } std::cout << board[i][j] << " | "; } std::cout << std::endl; if (i == 0)continue; std::cout << "---+---+---" << std::endl; } } // 补充返回值void,删除重复的int i声明 void draw(int position, Player &player){ int i, j; i = position/3; if (i == 0)i = 2; j = position%3; } }; class Player{ char symbol; public: }; int main() { Board board(3); Player player1; board.display(); return 0; }
补充说明
如果后续你需要在draw方法内部访问Player类的成员属性或方法,只需要保证draw方法的具体实现放在Player类的完整定义之后即可,不需要调整现有的声明顺序。
内容的提问来源于stack exchange,提问作者Meilianto Luffenz
相关产品推荐
相关产品推荐

