C++错误:无法将指针转换为引用(Netbeans)

C++ error: could not convert pointer to reference (Netbeans)

本文关键字:引用 Netbeans 转换 指针 错误 C++      更新时间:2023-10-16

好的,我不确定我是否正确命名了这个,但问题出在这里。我一直试图将一个包含用户定义的Course对象的数组传递给函数,但它给了我错误"无法转换'(Course*)(&courseCatalog)'"。此外,如果我的代码有点难以阅读,也很抱歉。很多都被评论掉了,所以我可以测试一些东西。

我的主页:

#include "cc.h"
int main(int argc, char** argv) {
    bool again=1;
    Course c;
    ifstream catalogIn("catalog.dat");
    ofstream catalogOut("catalog.dat");
    Course courseCatalog[256];
    loadInCourses(catalogIn, courseCatalog);
    courseCatalog[getNumCourses(courseCatalog)+1]=addCourse();
    loadOutCourses(catalogOut, courseCatalog);
    return 0;
}

我的功能:

#include "cc.h"
int displayMainMenu(){
  int choice;
  cout<<endl<<"**********MAIN MENU**********"<<endl;
  cout<<"1. Print List Schedule"<<endl;
  cout<<"2. Print Weekly Schedule"<<endl;
  cout<<"3. Get Course"<<endl;
  cout<<"4. Advanced Options"<<endl;
  cout<<"0 to Quit"<<endl;
  cout<<"*****************************"<<endl<<endl;
  cout<<"Menu Choice: ";
  cin>>choice;
  return choice;
}
int displayAdvMenu(){
  int choice;
  cout<<endl<<"**********ADV MENU**********"<<endl;
  cout<<"1. Add Course to Catalog"<<endl;
  cout<<"2. Remove Duplicates"<<endl;
  cout<<"0 to go Back"<<endl;
  cout<<"****************************"<<endl<<endl;
  cout<<"Menu Choice: ";
  cin>>choice;
  return choice;
}
Course addCourse(){
  Course course;
  cout<<"nCourse name:tt";
  cin.ignore();
  cin.getline(course.name, CNAMESIZE);
  cout<<"Course ID:tt";
  cin.getline(course.id, CIDSIZE);
  cout<<"Number of credits:t";
  cin>>course.credits;
  return course;
}
void loadInCourses(ifstream & ifs, Course courseCatalog[]){
    int i=0;
    while(ifs>>courseCatalog[i].credits){
        ifs.getline(courseCatalog[i].name, CNAMESIZE, ',');
        ifs.getline(courseCatalog[i].id, CIDSIZE, ',');
        ifs.getline(courseCatalog[i].professor, CPROFSIZE, ',');
        ifs.getline(courseCatalog[i].semester, CSEMSIZE, ',');
        ifs.get(courseCatalog[i].grade);
        i++;
    }
    return;
}
void loadOutCourses(ofstream & ofs, Course courseCatalog[]){
    for(int i=0; i<=getNumCourses(courseCatalog); i++){
        ofs<<courseCatalog[i].credits<<
             courseCatalog[i].name<<","<<
             courseCatalog[i].id<<","<<
             courseCatalog[i].professor<<","<<
             courseCatalog[i].semester<<","<<
             courseCatalog[i].grade<<endl;   
    }
}
Course findCourse(ifstream & ifs){
    char attribute;
    string needle;
    int credits;
    int name;
    int id;
    bool again=1;
    int numLines = getNumLines(ifs);
    cout<<"Search by (N)ame or (I)d? ";
    cin>>attribute;
    while(again){
        switch(attribute){
            case 'N': case 'n':
                cout<<"Enter name of course: ";
                cin>>name;
                for(int i=0; i<numLines; i++){
                }
                break;
            case 'I': case 'i':
                cout<<"Enter course ID: ";
                cin>>id;
                break;
            default:
                cout<<"Invalid Attribute. Try Again."<<endl;
        }
    }
}
int getNumCourses(Course courseCatalog[]){
    int numcourses=0;
    for(int i=0;courseCatalog[i].credits!=0;i++){
        numcourses++;
    }
    return numcourses;;
}
int getNumLines(ifstream & ifs){
    char line[1];
    int count=0;
    while(ifs.getline(line, 1)){
        count++;
    }
    ifs.close();
    return count;
}
ostream& operator<<(ostream& os, const Course c){
    os<<endl<<c.name<<endl<<c.id<<endl<<c.credits<<" cr hrs"<<endl;
    return os;
}

我的头文件:

#ifndef CC_H
#define CC_H
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int PREREQ_SIZE = 15;
const int POSTREQ_SIZE = 15;
const int CNAMESIZE=40;
const int CIDSIZE=15;
const int CPROFSIZE=40;
const int CSEMSIZE=15;
struct Course{
  char name[CNAMESIZE];
  char id[CIDSIZE];
  int credits;
  char professor[CPROFSIZE];
  char semester[CSEMSIZE];
  char grade;
  float timeStart;
  float timeStop;
  friend ostream& operator<<(ostream& os, const Course c);
};
Course addCourse();
int displayMainMenu();
int displayAdvMenu();
void printString(Course c);
void loadInCourses(ifstream & ifs, Course courseCatalog);
void loadOutCourses(ofstream & ofs, Course courseCatalog);
Course findCourse(ifstream & ifs);
int getNumCourses(Course courseCatalog[]);
int getNumLines(ifstream & ifs);
#endif

更新#1:

#include "cc.h"
int main(int argc, char** argv) {
    bool again=1;
    Course c;
    char catalogFilename[128]="catalog.dat";
    ifstream catalogIn(catalogFilename, ios_base::app);
    ofstream catalogOut(catalogFilename, ios_base::app);
    Course courseCatalog[256];
    loadInCourses(catalogIn, courseCatalog);

    courseCatalog[getNumCourses(courseCatalog)+1]=addCourse();
    loadOutCourses(catalogOut, courseCatalog);
    return 0;
}

功能:

#include "cc.h"
int displayMainMenu(){
  int choice;
  cout<<endl<<"**********MAIN MENU**********"<<endl;
  cout<<"1. Print List Schedule"<<endl;
  cout<<"2. Print Weekly Schedule"<<endl;
  cout<<"3. Get Course"<<endl;
  cout<<"4. Advanced Options"<<endl;
  cout<<"0 to Quit"<<endl;
  cout<<"*****************************"<<endl<<endl;
  cout<<"Menu Choice: ";
  cin>>choice;
  return choice;
}
int displayAdvMenu(){
  int choice;
  cout<<endl<<"**********ADV MENU**********"<<endl;
  cout<<"1. Add Course to Catalog"<<endl;
  cout<<"2. Remove Duplicates"<<endl;
  cout<<"0 to go Back"<<endl;
  cout<<"****************************"<<endl<<endl;
  cout<<"Menu Choice: ";
  cin>>choice;
  return choice;
}
Course addCourse(){
  Course course;
  cout<<"nCourse name:tt";
  cin.ignore();
  cin.getline(course.name, CNAMESIZE);
  cout<<"Course ID:tt";
  cin.getline(course.id, CIDSIZE);
  cout<<"Number of credits:t";
  cin>>course.credits;

  /*<<"Enter semester: ";
  cin.getline(course.semester);
  for(int i=0; i<PREREQ_SIZE && choice==1; i++){
    bool choice;
    cout<<"Add PreReq?: ";
    cin>>choice;
    if(choice==1){
      ...
    }
  }
  for(int i=0; i<POSTREQ_SIZE && choice==1; i++){
    bool choice;
    cout<<"Add PostReq?: ";
    cin>>choice;
    if(choice==1){
      ...
    }
  }  */
  return course;
}
void loadInCourses(ifstream & ifs, Course courseCatalog[]){
    cout<<"b*"<<endl<<courseCatalog[0];
    int i=0;
    while(ifs>>courseCatalog[i].credits){
        ifs.getline(courseCatalog[i].name, CNAMESIZE, ',');
        ifs.getline(courseCatalog[i].id, CIDSIZE, ',');
        ifs.getline(courseCatalog[i].professor, CPROFSIZE, ',');
        ifs.getline(courseCatalog[i].semester, CSEMSIZE, ',');
        ifs.get(courseCatalog[i].grade);
        i++;
        cout<<"d*"<<endl<<courseCatalog[i];
    }
    cout<<"c*"<<endl<<courseCatalog[0];    
    return;
}
void loadOutCourses(ofstream & ofs, Course courseCatalog[]){
    for(int i=0; i<=getNumCourses(courseCatalog); i++){
        ofs<<courseCatalog[i].credits<<
             courseCatalog[i].name<<","<<
             courseCatalog[i].id<<","<<
             courseCatalog[i].professor<<","<<
             courseCatalog[i].semester<<","<<
             courseCatalog[i].grade<<endl;   
    }
}
Course findCourse(ifstream & ifs){
    char attribute;
    string needle;
    int credits;
    int name;
    int id;
    bool again=1;
    int numLines = getNumLines(ifs);
    cout<<"Search by (N)ame or (I)d? ";
    cin>>attribute;
    while(again){
        switch(attribute){
            case 'N': case 'n':
                cout<<"Enter name of course: ";
                cin>>name;
                for(int i=0; i<numLines; i++){
                }
                break;
            case 'I': case 'i':
                cout<<"Enter course ID: ";
                cin>>id;
                break;
            default:
                cout<<"Invalid Attribute. Try Again."<<endl;
        }
    }
}
int getNumCourses(Course courseCatalog[]){
    int numcourses=0;
    for(int i=0;courseCatalog[i].credits!=0;i++){
        numcourses++;
    }
    return numcourses;;
}
int getNumLines(ifstream & ifs){
    char ch;
    int count=0;
    while(ch=ifs.get()){
        count+=(ch=='n'?1:0);
    }
    ifs.close();
    return count;
}
ostream& operator<<(ostream& os, const Course c){
    os<<endl<<c.name<<endl<<c.id<<endl<<c.credits<<" cr hrs"<<endl;
    return os;
}

标题:

#ifndef CC_H
#define CC_H
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int PREREQ_SIZE = 15;
const int POSTREQ_SIZE = 15;
const int CNAMESIZE=40;
const int CIDSIZE=15;
const int CPROFSIZE=40;
const int CSEMSIZE=15;
struct Course{
  char name[CNAMESIZE];
  char id[CIDSIZE];
  int credits;
  char professor[CPROFSIZE];
  char semester[CSEMSIZE];
  char grade;
  float timeStart;
  float timeStop;
  friend ostream& operator<<(ostream& os, const Course c);
};
Course addCourse();
int displayMainMenu();
int displayAdvMenu();
void printString(Course c);
void loadInCourses(ifstream & ifs, Course courseCatalog[]);
void loadOutCourses(ofstream & ofs, Course courseCatalog[]);
Course findCourse(ifstream & ifs);
int getNumCourses(Course courseCatalog[]);
int getNumLines(ifstream & ifs);
#endif  /* CC_H */

cc.h中,这些行:

void loadInCourses(ifstream & ifs, Course courseCatalog);
void loadOutCourses(ofstream & ofs, Course courseCatalog);

应该是

void loadInCourses(ifstream & ifs, Course courseCatalog[]);
void loadOutCourses(ofstream & ofs, Course courseCatalog[]);

此外,getNumLines中存在逻辑错误。如果istream::getline函数在到达行的末尾之前填充了缓冲区,则不会丢弃行的其余部分。你将在接下来的阅读中得到这行的其余部分。

相反,您可以只执行ifs.get()并计算发生了多少n

此功能关闭ifs。它只从findCourse调用,而findCourse从未被调用过。但是,当您调用findCourse时,请注意,如果您想再次读取(或重新打开)文件,则需要将流倒回起始位置。

您的错误应该有两部分,不能从。。。和…

你正在从。。函数签名定义了到…

两者不一样。您必须更改函数签名以匹配传入的From,或者修改传递的内容以匹配函数原型定义的to。

你会发现阅读整个错误是最有帮助的,你可能会认为发布整个错误值得额外的时间,因为向我们展示部分错误几乎毫无意义。这会给你带来毫无意义的评论。。

如果你的after是一个函数,它将指针指向Course的任何数组,那么你可能应该这样称呼它:

Course (*courseCatalog)[]

或者简单地说:

课程*couseCatalog