我正在尝试修改结构中的数据,但似乎无法使其正常工作。 很高兴在必要时提供更多信息。
actTree返回一个二进制搜索树。
findNode返回该树上的一个节点。
Data()返回actData。
```
struct actData
{
string year,award,winner,name,film;
};
```
void modifyActRecord() {
cout << "Enter the name of the film for the movie data you would like to modify:" << endl;
cin.ignore();
string s;
getline(cin, s);
cout << "Which field would you like to modify?" << endl;
cout << "Your choices are year, award, winner, name, film"
<< endl;
string f;
getline(cin, f);
if (f == "year") {
cout << "What would you like to change it to?" << endl;
string in;
getline(cin, in);
//line in question
actTree->findNode(s)->Data().year = in;
}
I can access the code fine with:
cout << actTree->findNode(s)->Data().year;
but cannot modify it with:
actTree->findNode(s)->Data().year = in;
答案 0 :(得分:1)
只能为左值分配一个值。这意味着只允许左值出现在表达式的左侧。您必须先知道对象在哪里,然后才能对其进行修改。左值可以被认为是地址本身,尽管这可能会导致左值和指针之间的混淆。
int x; // x is an lvalue
int* p; // *p is an lvalue
int a[100]; // a[42] is an lvalue; equivalent to *(a+42)
// note: a itself is also an lvalue
struct S { int m; };
struct S s; // s and s.m are lvalues
struct S* p2 = &s; // p2->m is an lvalue; equivalent to (*p2).m
// note: p2 and *p2 are also lvalues
另一方面, rvalue是表达式的值。在上面的代码中,将x
视为左值,并将value of x
视为右值。将*p
视为左值,并将value of *p
视为右值。等等
int x, y;
int z = 2*x + 3*y;
在上面的示例中,x
,y
和z
是左值。另一方面,表达式2*x
,3*y
甚至(2*x + 3*y)
都是右值。由于右值只是一个值,而不是值的位置,因此无法将其赋值,就像您不能说2 * x = 4一样,因为它根本不正确。
因此,在您的示例中,data().year
不是左值。因此它不能分配给,只能使用。因此,cout << actTree->findNode(s)->Data().year;
可以正常工作,但是actTree->findNode(s)->Data().year = in;
不能正常工作,因为您可能返回了actData
。您需要返回一个可修改的左值,在您的情况下为actData&
。
class Node
{
actData m_data;
public:
actData Data()
{
return m_data;//returning value of m_data, not the address
}
/*Change above function to below function*/
actData* Data()
{
return &m_data;//returning address here so that it can be modified
}
};
执行上述操作应使actTree->findNode(s)->Data().year = in;
正常工作。
答案 1 :(得分:0)
我认为@Mohitesh Kumar提供的答案是正确的,但我对lvalue
和rvalue
知之甚少。
我所知道的是,actTree->findNode(s)->Data()
返回一个对象,并且
actTree->findNode(s)->Data().year
是该对象的成员。
因此,当您编写actTree->findNode(s)->Data().year = in;
时,是在为返回的对象的成员分配一个值,而不修改actTree
。
您可能要做的事情是:
someObject = actTree->findNode(s)->Data();
someObject.year = in;
即使如此,它也不会修改actTree
。然后可能是您应该为data
创建一个setter方法并传递someObject
的值