为何OddSeq和SquareSeq提示未定义?是否需要通过#include引入定义?
问题解答
1. OddSeq、SquareSeq未定义的核心原因
- 你当前代码仅定义了抽象基类
AbstractSeq,OddSeq(奇数序列类)、SquareSeq(平方序列类)是需要自行实现的、继承自AbstractSeq的子类,你既没有在当前文件中声明/实现这两个类,也没有引入包含这两个类定义的头文件,编译器无法识别这两个标识符,因此会报未定义错误。 - 额外补充代码中存在的其他不符合C++规范的问题:
- C++规定
main函数是程序的全局入口函数,不能定义在类的内部,你现在把main写在AbstractSeq类内部的写法是错误的,会引发编译错误。 - 你当前的
AbstractSeq类仅定义了纯虚函数test,但代码中调用的printSeq、sumSeq成员函数在基类中没有任何声明,即便实现了两个子类,运行时也会报错。 - 打印平方序列的代码行错误调用了
odd.printSeq(k, m),应该改为sq.printSeq(k, m)才会输出平方序列内容。
- C++规定
2. 是否需要用#include语句引入定义
要看这两个类的实现位置:
- 如果你将
OddSeq、SquareSeq的类定义写在单独的头文件(比如seq.h)中,那么需要在当前代码顶部加#include "seq.h"引入头文件完成类定义的导入。 - 如果你直接在当前文件的
AbstractSeq类定义之后、main函数之前实现这两个继承自AbstractSeq的子类,就不需要额外加#include语句。
参考修正后的代码框架
#include <iostream> #include <string> using namespace std; class AbstractSeq { public: // 纯虚函数,子类需要实现对应逻辑,返回第n项的序列值 virtual int getTerm(int n) = 0; // 基类实现通用的打印序列方法 void printSeq(int k, int m) { for (int i = k; i <= m; i++) { cout << getTerm(i) << " "; } cout << endl; } // 基类实现通用的序列求和方法 int sumSeq(int k, int m) { int sum = 0; for (int i = k; i <= m; i++) { sum += getTerm(i); } return sum; } }; // 实现OddSeq子类 class OddSeq : public AbstractSeq { public: int getTerm(int n) override { // 第n个奇数是2n-1 return 2 * n - 1; } }; // 实现SquareSeq子类 class SquareSeq : public AbstractSeq { public: int getTerm(int n) override { // 第n个平方数是n² return n * n; } }; // main函数放在全局位置 int main() { OddSeq odd; SquareSeq sq; int k; int m; cout << "Enter the lower bound integer k: "; cin >> k; cout << "Enter the upper bound integer m: "; cin >> m; cout << "The terms of the odd numbers sequence are: " << endl; odd.printSeq(k, m); cout << "Their sum is: "; cout << odd.sumSeq(k, m) << endl; cout << "The terms of the square numbers sequence are: " << endl; sq.printSeq(k, m); cout << "Their sum is: "; cout << sq.sumSeq(k, m) << endl; return 0; }
内容的提问来源于stack exchange,提问作者Epicskylegend
相关产品推荐
相关产品推荐

