1

我试图在 C++ 中调用一个函数,我认为它与 C 中的相同,但是在尝试将 C 程序转换为 C++ 时,我遇到了一个错误,它说函数未声明。

这是我的课:

class contacts
 {
  private:;
          char *First_Name;
          char *Last_Name;
          char *home;
          char *cell;
  public:;
  //constructor
         contacts()
         {
         }  
//Function declaration     
void readfile (contacts*friends ,int* counter, int i,char buffer[],FILE*read,char user_entry3[]);

  };

这是我的菜单功能的片段:

 if(user_entry1==1)
  {
    printf("Please enter a file name");
    scanf("%s",user_entry3); 
    read=fopen(user_entry3,"r+");

   //This is the "undeclared" function
   readfile(friends ,counter,i,buffer,read,user_entry3);
   }else;

我显然做错了什么,但每次我尝试编译我都会得到readfile undeclared(first use this function)我在这里做错了什么?

4

4 回答 4

2

您需要创建一个contacts类对象,然后调用readfile该对象。像这样: contacts c; c.readfile();

于 2012-11-21T04:43:02.787 回答
0

是类内部的“菜单”功能contacts吗?您设计它的方式,它只能在类的实例上调用。您可以根据确切的含义readfile来选择contacts

我猜这个函数会读取所有联系人,而不仅仅是 1 个联系人,这意味着它可以成为一个静态函数

static void readfile(... ;

并称为

contacts::readfile(...;

或者,如果您不需要直接访问类的内部,您可以在类外部声明它(作为一个自由函数,类似于普通的 C 函数)并完全按照您现在的方式使用。这实际上是编译器在遇到您的代码时正在搜索的内容。

另外,我建议您重命名class contacts->class contact因为似乎每个对象都只包含一个人的联系信息。

于 2012-11-21T04:43:20.530 回答
0

我建议重构以使用 STL 向量。

#include <vector>
#include <ReaderUtil>

using namespace std;

vector< contact > myContactCollection;
myContactCollection.push_back( Contact("Bob",....) );
myContactCollection.push_back( Contact("Jack",....) );
myContactCollection.push_back( Contact("Jill",....) );

或者...

myContactCollection = ReaderClass::csvparser(myFile);

在哪里

ReaderClass::csvparser(std::string myFile) returns vector<Contact>
于 2012-11-21T05:01:40.683 回答
0

由于您的 readfile 函数位于 contacts 类中,因此上面的答案在技术上是正确的,因为您需要创建对象的实例然后调用该函数。但是,从 OO 的角度来看,您的类函数通常应该只对包含它的类的对象的成员进行操作。您在这里拥有的更像是一个通用函数,它接受多种类型的参数,其中只有一个是指向本身包含您正在调用的函数的类的指针,如果您考虑一下,这有点奇怪。因此,您会将指向该类的指针传递给该类的成员函数,该类的成员函数需要它的两个实例。您不能将类视为对指向结构的指针的简单替换。由于这是一堂课,您将所需的所有变量声明为类的成员,因此无需将它们作为参数传递(类的要点之一是将通用数据与类成员数据隔离开来)。这是一个应该为您指明正确方向的更新。

   class contacts
     {
      private:

          char *First_Name;
          char *Last_Name;
          char *home;
          char *cell;
          FILE *read;  // these all could also be declared as a stack variable in 'readfile'


    public:
    //constructor

    contacts()
        {
        }  

    //destruction
    ~contacts()
    {
    }

    //Function declaration     
    int contacts::readfile (char * userEnteredFilename);

    };


    contacts myContact = new contacts();

    printf("Please enter a file name");
    scanf("%s",user_entry3); 

    int iCount = myContact->readfile(user_entry3);

    // the readfile function should contain all of the file i/O code 
于 2012-11-21T05:39:13.100 回答