错误:必须具有类类型

时间:2013-11-14 01:12:44

标签: c++ visual-studio-2010

我需要创建一个联系人列表,并且我在代码中不断出现此错误:表达式必须具有类类型。

以下是代码:

#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

这里究竟出现了什么问题以及如何解决?

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

您的代码中存在多个错误,但您指向的错误如下:

  • myPhoneApp[50].FirstNamestring
  • 字符串由字符组成。您可以使用下标运算符[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[]中的联系人,而不仅仅是继续检查FirstNameindex 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”等。