我需要创建一个联系人列表,并且我在代码中不断出现此错误:表达式必须具有类类型。
以下是代码:
#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
这里究竟出现了什么问题以及如何解决?
感谢您的帮助
答案 0 :(得分:3)
您的代码中存在多个错误,但您指向的错误如下:
myPhoneApp[50].FirstName
是string
[i]
.
访问成员,但不能在基元myPhoneApp[50].FirstName[i]
是char
,并且由于char
是基元,因此使用点无效。答案 1 :(得分: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
的个别字符。
其次,您需要遍历myPhoneApp[]
中的联系人,而不仅仅是继续检查FirstName
中index 50
字符串的不同字符,这些字符甚至不必设置。
第三,没有string.compare()
重载只需要一个int
作为参数。你要找的是比较两个字符串的方法,这就是我的回答。
第四,你还没有达到的问题......在if
语句之后你有一个分号,所以无论if
语句的条件如何,都没有真正执行......并且无论如何,你只需在一次迭代后点击break;
。
dashblinkenlight的回答解释了为什么错误信息就是这样,我的会告诉你如何修复你的程序。
答案 2 :(得分: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_”)或后缀(某些地方添加“_”来表示成员变量)来为成员变量提供独特的名称。
E.g。
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”等。