错误:必须具有类类型

Error: Must have class type

本文关键字:类型 错误      更新时间:2023-10-16

我需要创建一个联系人列表,但我的代码中不断收到此错误:表达式必须具有类类型。

代码如下:

#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

这里到底是什么问题,我该如何解决?

感谢您的帮助

代码中有多个错误,但您指向的错误如下所示:

  • myPhoneApp[50].FirstName是一个string
  • 字符串由字符组成。使用下标运算符访问字符串中的字符[i]
  • 字符是原始的。
  • 可以使用类和结构上的点.访问成员,但不能访问基元
  • 因为myPhoneApp[50].FirstName[i]是一个char,并且因为char是一个基元,所以在上面使用点是无效的。
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的单个字符。

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

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

第四,一个你还没有解决的问题...您在if语句后有一个分号,因此无论if语句的条件如何,都没有真正执行任何内容......无论如何,您都会在一次迭代后达到该break;

Dashblinkenlight的回答解释了为什么错误消息是这样的,我的告诉你如何修复你的程序。

这里有几件小事聚集在一起,给你带来一个问题。

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"等。