为什么我的某些数据成员"expression must be an lvalue or a function designator"收到此错误?

Why do I get this error "expression must be an lvalue or a function designator" for some of my data members?

本文关键字:designator function 错误 or an 我的 数据成员 expression 为什么 be must      更新时间:2023-10-16

我正在尝试创建一个函数,该函数从我创建的类中打印出任何我喂养的功能。我只能让一些我的类对象数据成员使用我的打印功能。

我尝试在我在网上找到的某些源代码中使用指针和参考,但它们没有起作用。解决这个问题大约一个星期后,我觉得我已经尝试了所有事情。

void print(string* object);

enum Degree { SECURITY = 1, NETWORKING = 2, SOFTWARE = 3};
class Student {
    public:
        Student(string ID, string first, string last, string Email, int Age, int days1, int days2, int days3, Degree StudentDegree) {
            studentID = ID;
            firstName = first;
            lastName = last;
            email = Email;
            age = Age;
            daysTillComplete[0] = { days1 };
            daysTillComplete[1] = { days2 };
            daysTillComplete[2] = { days3 };
            studentDegree = StudentDegree;
            return;
        }
        string getID() const;
        void setID(string ID);
        string getFirst() const;
        void setFirst(string ID);
        string getLast() const;
        void setLast(string ID);
        string getEmail() const;
        void setEmail(string ID);
        int getAge() const;
        void setAge( int Age);
        int getdays1();
        int getdays2();
        int getdays3();
        void setDaysTilComplete(int days, int days1, int days2);
        Degree getDegree() const;
        void setDegree(Degree degreeType);
    private:
        string studentID = "No name"; 
        string firstName = "No name";
        string lastName = "No name";
        string email = "No name";
        int age = 7;
        int daysTillComplete[3];
        Degree studentDegree = NETWORKING;
};
void print(string* object) {
    cout << *object << endl;
}
string Student::getID() const {
    return studentID;
}
string Student::getFirst() const {
    return firstName;
}
string Student::getLast() const {
    return lastName;
}
string Student::getEmail() const {
    return email;
}
int Student::getAge() const {
    return age;
}
int Student::getdays1() {
    return daysTillComplete[0];
}
int Student::getdays2() {
    return daysTillComplete[1];
}
int Student::getdays3() {
    return daysTillComplete[2];
}
Degree Student::getDegree() const {
    return studentDegree;
}
void Student::setID(string ID) {
    studentID = ID;
}
void Student::setFirst(string first) {
    firstName = first;
}
void Student::setLast(string last) {
    lastName = last;
}
void Student::setEmail(string Email) {
    email = Email;
}
void Student::setAge(int studentAge) {
    age = studentAge;
}
void Student::setDaysTilComplete(int days1, int days2, int days3) {
    daysTillComplete[0] = days1;
    daysTillComplete[1] = days2;
    daysTillComplete[2] = days3;
}
void Student::setDegree(Degree degreeType) {
    studentDegree = degreeType;
}
int main() {
    Student vallery("A1", "Vallery", "Williams", "vallery.a.williams1234@gmail.com",21,52,28,32,NETWORKING);    
    print(&vallery.getID());
    print(&vallery.getFirst());
    print(&vallery.getLast());
    print(&vallery.getEmail());
    //print(&vallery.getAge());     <--- will not compile if this statement is in the program
    //print(&vallery.getdays1());       <--- will not compile if this statement is in the program
    ////print(&vallery.getdays2());     <--- will not compile if this statement is in the program
    ////print(&vallery.getdays3());     <--- will not compile if this statement is in the program
    //print(&vallery.getDegree());      <--- will not compile if this statement is in the program
    cin.get();

    return 0;
}

我的预期结果例如打印(vallery.getFirst(;将是打印的瓦利里。这有效,但是当我打印时(vallery.getage(;它应该是21,但我什至无法编译,因为我得到"表达式必须是L值或功能指定器"错误。同样,将int代替字符串用于打印功能的数据类型也不起作用。我必须错误地使用一些东西。有人可以将我指向正确的方向吗?经过一大堆研究,我没有找到任何解决方案。

此代码可能有几件事出现问题。

最明显的是您的打印功能期望string*。失败的呼叫是您尝试给出函数不是string*的呼叫。例如,getAge()返回一个INT,您正在返回返回的INT的地址。因此,您正在尝试调用打印(INT*(,然后失败。为了解决此问题,您可以使用模板或过载。这是推荐的模板功能:

template <typename T>
print (const T& _object) 
{
 cout << _object << endl;
}

第二个问题,这是掩盖第一个错误的原因来自您正在使用PTR而不是参考(或我的模板函数中的const引用(。如果要打印某些东西,则希望它绝对可以在那里而不是nullptr。因此,请使用参考。在这么说时,我认为您说的那些会起作用的人绝对不应该在任何理智的编译器下(即使是字符串*(。也许当前的错误是隐藏这些错误。

错误"表达式必须是lvalue或功能指定器" 来自您试图获取R值地址的事实。这是暂时和/或尚未绑定到名称的值。您的Getters返回存储在您的学生对象中的值的副本,此值没有地址。您正在尝试获取无所求的价值的地址,因此必须是LVALUE的错误。

解决这个问题:首先不要使用指针,请使用const引用。其次,让您的Getters返回对象的const参考。例如,

const string& Student::getID() const;

如果您的打印功能采用const引用,则可以在返回int或其他原始类型的情况下处理临时变量。由于您的其他Getters返回对可寻址值的引用,因此打印功能也可以获取此引用,而无需不必要复制该值。