0

連絡先のリストを作成する必要がありますが、コードでこのエラーが発生し続けます: 式にはクラス タイプが必要です。

コードは次のとおりです。

#include<iostream>
#include<string>

using namespace std;

class PhoneApp {
public:

string FirstName;
string LastName;
string PhoneNumber;
string EmailID;

PhoneApp() {
    FirstName = "";
    LastName = "";
    PhoneNumber = "";
    EmailID = "";
}

void addContact(){
    cout << "Enter your contact's first name: ";
    cin >> FirstName;

    cout << "Enter your contact's last name: ";
    cin >> LastName;

    cout << "Enter your contact's phone number: ";
    cin >> PhoneNumber;

    cout << "Enter your contact's email address: ";
    cin >> EmailID;
}

void displayContact(){
    cout << "Here's your contact details: " << endl;
    cout << "FirstName: " << FirstName << endl;
    cout << "LastName: " << LastName << endl;
    cout << "PhoneNumber: " << PhoneNumber << endl;
    cout << "EmailID: " << EmailID << endl;
}

};

int main(){


PhoneApp myPhoneApp[50];
int index = 0;

while(1){

    cout << "Press 1 to add contacts" << endl;
    cout << "Press 2 to search for a contact" << endl;
    cout << "Anything else to quit" << endl;
    int choice;
    cin >> choice;

    switch(choice){

    case 1:{ myPhoneApp[index].addContact();
        index++;
        break;}

    case 2: { cout << "Enter a first name to search for: " << endl;
        string search = "";
        cin >> search;
        for (int i = 0; i < index; i++) {       
            if(myPhoneApp[50].FirstName[i].compare(index) == 0);
            break;
            }
            }

    default: exit(1);
    }

}



system("pause");
return 0;
}

エラーがポップアップします

if(myPhoneApp[50].FirstName[i].compare(index) == 0

ここでの問題は正確には何ですか?どうすれば修正できますか?

助けてくれてありがとう

4

3 に答える 3

3

コードには複数のエラーがありますが、指摘しているのは次のとおりです。

  • myPhoneApp[50].FirstNameですstring
  • 文字列は文字で構成されます。添字演算子を使用して文字列内の文字にアクセスします[i]
  • 文字はプリミティブです。
  • .クラスと構造体ではドットを使用してメンバーにアクセスできますが、プリミティブではアクセスできません
  • myPhoneApp[50].FirstName[i]charであり、charはプリミティブであるため、ドットを使用することは無効です。
于 2013-11-14T01:20:57.317 に答える
1
cout << "Enter a first name to search for: " << endl;
string search = "";
cin >> search;
for (int i = 0; i < index; i++) {       
    if(myPhoneApp[i].FirstName.compare(search) == 0) {
        //do stuff
        break;
    }
}

いくつかのことがうまくいかなかった。

まず、の個々の文字ではなく、FirstName文字列全体を と比較する必要があります。searchFirstName

2 番目に、必ずしも設定されていないの文字列myPhoneApp[]のさまざまな文字をチェックし続けるだけでなく、 の連絡先を反復処理する必要があります。FirstNameindex 50

第 3 に、引数としてstring.compare()1 つを受け取るオーバーロードはありません。intあなたが探しているのは、2 つの文字列を比較する方法です。これが私の答えです。

第 4 に、まだ到達していない問題です...ステートメントの後にセミコロンがあったifため、ステートメントの条件に関係なく、if実際には何も実行されません...そしてbreak;、1 回の反復の後にそれをヒットするだけです。どのような。

dashblinkenlight の回答は、エラー メッセージが何であったかを説明しています。私は、プログラムを修正する方法を示しています。

于 2013-11-14T01:18:23.123 に答える
0

ここにいくつかの小さなものが集まって問題を引き起こしています。

if(myPhoneApp[50].FirstName[i].compare(index) == 0);
    break;

まず、「if」行の最後にセミコロンがあります

if();

「テストを行い、その後は忘れてください。常に次の行のことを行います」という意味です。

次に、連絡先リストの 1 つの要素しかチェックしていません。

myPhoneApp[50]

きっとあなたはそうではない

myPhoneApp[i]

次に、myPhoneApp[50].Firstnamestd::string の 1 つのインスタンスに解決されます。次に、その名前の文字にインデックスを付けて、インデックス内のエントリ数と比較しようとします。

myPhoneApp[50].FirstName[i].compare(index)

あなたがおそらく意味することは

if(myPhoneApp[i].FirstName == search)
    break;

- - 編集 - -

クラス名と同じように、「myPhoneApp」というキャメルケースの大文字の名前のメンバー変数を指定しました。これはあなたを混乱させるでしょう、そしてそれはあなたのメンバー変数にそれらの型に一致する名前を付けることができないことを意味します:

PhoneApp PhoneApp;

コンパイルエラーです。

一般的な方法は、プレフィックス (メンバーの "m_") またはサフィックス (メンバー変数を示すために "_" を追加する場所もあります) を追加して、メンバー変数に固有の名前を付けることです。

例えば

class PhoneApp {
public:

    string m_FirstName;
    string m_LastName;
    string m_PhoneNumber;
    string m_EmailID;

    PhoneApp() {
        m_FirstName = "";
        m_LastName = "";
        m_PhoneNumber = "";
        m_EmailID = "";
    }
};

または「m_firstName」、「m_lastName」など。

于 2013-11-14T01:45:06.347 に答える