You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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++语法规则,因此触发报错。

解决步骤

  1. 在main函数中创建Film类的实例对象
  2. 通过该对象调用所有非静态成员函数
  3. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:20:19