C++非静态成员函数调用错误:如何在main中调用Film类成员函数?
问题
将原有程序转为面向对象模式时,触发「Invalid use of non-static member function」错误,涉及Film类的showList、showOne、showTwo、showThree、showFour非静态成员函数。尝试过直接调用(如showOne())、类名限定调用(如Film::showOne()),要么报错,要么提示函数未在当前作用域声明,需要知道如何在QueryApp.cpp的main函数中正确调用这些成员函数。
错误原因
非静态成员函数必须通过类的实例对象来调用,不能直接像全局函数那样调用,也不能直接用类名调用(除非是静态成员函数)。当前main函数里直接调用showList()等函数,编译器找不到这些全局函数;用Film::showOne()调用非静态函数也不符合C++语法规则,因此触发报错。
解决步骤
- 在
main函数中创建Film类的实例对象 - 通过该对象调用所有非静态成员函数
- 修复
QueryApp.cpp中部分函数调用缺少括号的语法错误(比如showTwo应改为showTwo())
修改后的QueryApp.cpp代码
// Copyright // Purpose: Project 4 // Date 11/25/2022 // Author: Colton Sullivan #define MYSQLPP_MYSQL_HEADERS_BURIED #include <mysql++/mysql++.h> #include <iostream> #include "/home/sulli313/Project4/Film.h" int main() { int choice; // 创建Film类的实例对象 Film filmApp; // 通过对象调用非静态成员函数 filmApp.showList(); std::cin >> choice; if (choice == -1) { std::cout << "Bye!" << std::endl; } while (choice != -1) { while ( choice > 4 || choice < -1 || choice == 0 ) { std::cout << "The wrong choice!!!" << std::endl; std::cout << "" << std::endl; std::cout << "to continue, press enter..."; filmApp.showList(); std::cin >> choice; } if ( choice == 1 ) { filmApp.showOne(); } if ( choice == 2 ) { filmApp.showTwo(); // 修复:添加函数调用括号 } if ( choice == 3 ) { filmApp.showThree(); // 修复:添加函数调用括号 } if ( choice == 4 ) { filmApp.showFour(); // 修复:添加函数调用括号 } std::cin >> choice; if ( choice == -1 ) { std::cout << "Bye!" << std::endl; } } }
额外修复提示
Film.cpp中使用了std::setw但未包含对应头文件,建议在Film.cpp开头添加:
#include <iomanip> // 用于std::setw格式化输出
否则编译时会触发'setw' was not declared in this scope的错误。
内容的提问来源于stack exchange,提问作者Colton Sullivan
相关产品推荐
相关产品推荐

