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字符串与进行比较search,而不是FirstName.

其次,您需要遍历 in 中的联系人myPhoneApp[],而不仅仅是不断检查FirstNamein 字符串的不同字符index 50,这甚至不一定是设置的。

第三,没有string.compare()重载将单个int作为参数。您正在寻找的是比较两个字符串的方法,这就是我的答案。

第四,一个你还没有解决的问题......你的语句后面有一个分号if,所以无论语句的条件如何if,都没有真正执行......而且你只是break;在一次迭代后就遇到了,不有什么关系。

dashblinkenlight 的回答解释了为什么错误消息是这样的,我向您展示了如何修复您的程序。

于 2013-11-14T01:18:23.123 回答
0

这里有几件小事会导致您出现问题。

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

首先:您在“if”行的末尾有一个杂散分号

if();

意思是“做测试,然后忘记它。总是做下一行的事情”。

其次,您只检查联系人列表中的一个元素

myPhoneApp[50]

你肯定不是

myPhoneApp[i]

接下来,myPhoneApp[50].Firstname解析为 std::string 的单个实例,然后尝试索引该名称中的字母并将它们与索引中的条目数进行比较。

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 回答