0

C から C++ に変換しようとしているプログラムのメイン内で関数を呼び出そうとしています。他の関数内のすべての関数呼び出しはエラーなしでコンパイルされますが、メインの 1 つの関数呼び出しに到達すると、 no matching function for call to contacts::menu(contacts*[5], int*, int&, char[50])'

主なものは次のとおりです。

int main() {


 contacts *friends[5];
 char buffer[BUFFSIZE];
 int counter=0;
 int i=0;

 contacts::menu(friends, &counter,i,buffer);

 getch();
 return 0;
}

関数宣言を含むクラスは次のとおりです。

class contacts
{
  private:
          char *First_Name;
          char *Last_Name;
          char *home;
          char *cell;
  public:
  //constructor
         contacts()
         {
         }       

//Function declarations 
static void menu(contacts*friends ,int* counter,int i,char buffer[]);
};

メニュー機能の最初の部分は次のとおりです。

void contacts::menu(contacts*friends,int* counter, int i,char buffer[]) 
{
  int user_entry=0;
  int user_entry1=0;
  int user_entry2=0;
  char user_entry3[50]={'\0'};
  FILE *read;
  printf("Welcome! Would you like to import a file? (1)Yes or (2) No");
  scanf("%d",&user_entry1);
  if(user_entry1==1)
    {
     printf("Please enter a file name");
     scanf("%s",user_entry3); 
     read=fopen(user_entry3,"r+");

私が言ったように、私のプログラム内の他の関数はエラーを受け取りませんが、これはエラーを受け取ります。私は C++ が初めてなので、メイン内で関数を呼び出すために追加する必要がある特別なものがあるかどうかはわかりませんでした。

4

3 に答える 3

7

ここに問題があります

 contacts *friends[5];

あなたが渡す

void contacts::menu(contacts*friends,int* counter, int i,char buffer[]) 

これを関数に渡すと、へのポインターの配列が宣言されました。contactscontacts**

friends関数を現在のシグネチャで使用するには、配列を次のように宣言する必要があります。

contacts* friends = new contacts[5];

また

contacts friends[5];

contacts*後者の場合、配列を関数に渡すと機能します。これは、関数が期待する値に減衰するためです。最初のケースで作成したメモリを解放することを心配する必要がないため、後者のケースが望ましいです。new

于 2012-11-21T08:08:48.467 に答える
3

ポインターを使用しない

int main()
{
    contacts friends[5];

コードがコンパイルされます。

于 2012-11-21T08:14:09.670 に答える
0

contacts*あなたが渡そうとしている間、メニュー関数は最初の引数として期待していますcontacts*[]

于 2012-11-21T08:09:38.613 に答える