Class member 指向STL列表的特定节点成员?
Class member to point to a specific node member of an STL list?
如何将指向某人配偶姓名的指针存储为该人 class 的私有成员?
例如,假设我有以下代码:
#include <iostream>
#include <list>
using namespace std;
class person
{
private:
string name;
string *spouse;
public:
void setName(string tempName) { name = tempName; }
void setSpouse(string &tempSpouse) { spouse = &tempSpouse; } // ERROR HERE?
string getName() { return name; }
string getSpouse() { return spouse; } // ERROR HERE?
};
int main()
{
person entry;
list<person> personList;
list<person>::iterator itr1, itr2;
/* Adding two people/nodes to the linked list. */
entry.setName("John Doe");
personList.push_back(entry);
entry.setName("Tina Doe");
personList.push_back(entry);
/* Attempting to assign Tina Doe as John Doe's spouse. */
for (itr1 = personList.begin(); itr1 != personList.end(); itr1++)
{
if (itr1->getName() == "John Doe")
{
for (itr2 = personList.begin(); itr2 != personList.end(); itr2++)
{
if (itr2->getName() == "Tina Doe")
{
itr1->setSpouse(itr2->getName()); // ERROR HERE?
}
}
}
}
/* Displaying all Names with Spouses afterwards. */
for (itr1 = personList.begin(); itr1 != personList.end(); itr1++)
{
cout << "Name: " << itr1->getName() << " | Spouse: " << itr1->getSpouse() << endl;
}
return 0;
}
我无法将配偶姓名的地址分配给class中的指针成员。我在评论中指出了我认为可能存在错误的地方。
您可以在此处查看代码和错误:https://ideone.com/4CXFnt
任何帮助将不胜感激。谢谢。
getName
returns 是一个临时的 std::string
(name
变量的副本),并且编译器试图避免您引用将要引用的内存部分很快就会被删除。此错误与列表无关 - 要修复它,您需要在 spouse
变量中存储副本(这将导致在多个位置存储相同的数据)或 return 在 [=13= 中的引用].您也可以考虑创建另一个访问器(私有访问器),但这很丑陋。
我建议存储副本,但如果确实需要 references/pointes 那么修改行就足够了:
string getName() { return name; }
string getSpouse() { return spouse; } // ERROR HERE?
到
string& getName() { return name; }
string getSpouse() { return *spouse; } // ERROR HERE?
但是,为了保持一致性,我建议:
string& getName() { return name; }
string& getSpouse() { return *spouse; } // ERROR HERE?
你有两个问题。第一个很容易修复:getSpouse
没有 return 正确的类型。你应该写
string getSpouse() { return *spouse; } // Derefencing the pointer and returning a string
// or
string* getSpouse() { return spouse; } // Returning the pointer
第二个问题比较微妙。当您编写: itr2->getName()
时,您只有一个值(itr2->name 的 copy):您没有存储可以更改的变量,因此你不能引用它。
没有简单的方法可以让 class 实例中的指针指向另一个实例的私有变量。我想你应该质疑你做事的方式并创建一个指向 person
而不是指向名称的指针(记住指针很便宜,它们只是内存位置)。
class person
{
private:
string name;
person *spouse;
public:
void setSpouse(person *_spouse) { spouse = _spouse; }
person* getSpouse() { return spouse; }
string getSpouseName() { return spouse->getName(); }
};
这项工作,但仍然不安全:如果 spouse
被破坏并尝试从 person
访问它,你将 运行 陷入更深层次的问题......(注意你string
).
也有同样的问题
那么解决方法是什么?那么,如果你只想让B
成为A
的配偶,你可以先创建B
,然后在A
中使用构造函数进行引用。但是如果你想让 B
成为 A
的配偶而 A
成为 B
的配偶,你必须使用上面的不安全技巧并小心,或者储存class.
之外的配偶名单
如何将指向某人配偶姓名的指针存储为该人 class 的私有成员?
例如,假设我有以下代码:
#include <iostream>
#include <list>
using namespace std;
class person
{
private:
string name;
string *spouse;
public:
void setName(string tempName) { name = tempName; }
void setSpouse(string &tempSpouse) { spouse = &tempSpouse; } // ERROR HERE?
string getName() { return name; }
string getSpouse() { return spouse; } // ERROR HERE?
};
int main()
{
person entry;
list<person> personList;
list<person>::iterator itr1, itr2;
/* Adding two people/nodes to the linked list. */
entry.setName("John Doe");
personList.push_back(entry);
entry.setName("Tina Doe");
personList.push_back(entry);
/* Attempting to assign Tina Doe as John Doe's spouse. */
for (itr1 = personList.begin(); itr1 != personList.end(); itr1++)
{
if (itr1->getName() == "John Doe")
{
for (itr2 = personList.begin(); itr2 != personList.end(); itr2++)
{
if (itr2->getName() == "Tina Doe")
{
itr1->setSpouse(itr2->getName()); // ERROR HERE?
}
}
}
}
/* Displaying all Names with Spouses afterwards. */
for (itr1 = personList.begin(); itr1 != personList.end(); itr1++)
{
cout << "Name: " << itr1->getName() << " | Spouse: " << itr1->getSpouse() << endl;
}
return 0;
}
我无法将配偶姓名的地址分配给class中的指针成员。我在评论中指出了我认为可能存在错误的地方。
您可以在此处查看代码和错误:https://ideone.com/4CXFnt
任何帮助将不胜感激。谢谢。
getName
returns 是一个临时的 std::string
(name
变量的副本),并且编译器试图避免您引用将要引用的内存部分很快就会被删除。此错误与列表无关 - 要修复它,您需要在 spouse
变量中存储副本(这将导致在多个位置存储相同的数据)或 return 在 [=13= 中的引用].您也可以考虑创建另一个访问器(私有访问器),但这很丑陋。
我建议存储副本,但如果确实需要 references/pointes 那么修改行就足够了:
string getName() { return name; }
string getSpouse() { return spouse; } // ERROR HERE?
到
string& getName() { return name; }
string getSpouse() { return *spouse; } // ERROR HERE?
但是,为了保持一致性,我建议:
string& getName() { return name; }
string& getSpouse() { return *spouse; } // ERROR HERE?
你有两个问题。第一个很容易修复:getSpouse
没有 return 正确的类型。你应该写
string getSpouse() { return *spouse; } // Derefencing the pointer and returning a string
// or
string* getSpouse() { return spouse; } // Returning the pointer
第二个问题比较微妙。当您编写: itr2->getName()
时,您只有一个值(itr2->name 的 copy):您没有存储可以更改的变量,因此你不能引用它。
没有简单的方法可以让 class 实例中的指针指向另一个实例的私有变量。我想你应该质疑你做事的方式并创建一个指向 person
而不是指向名称的指针(记住指针很便宜,它们只是内存位置)。
class person
{
private:
string name;
person *spouse;
public:
void setSpouse(person *_spouse) { spouse = _spouse; }
person* getSpouse() { return spouse; }
string getSpouseName() { return spouse->getName(); }
};
这项工作,但仍然不安全:如果 spouse
被破坏并尝试从 person
访问它,你将 运行 陷入更深层次的问题......(注意你string
).
那么解决方法是什么?那么,如果你只想让B
成为A
的配偶,你可以先创建B
,然后在A
中使用构造函数进行引用。但是如果你想让 B
成为 A
的配偶而 A
成为 B
的配偶,你必须使用上面的不安全技巧并小心,或者储存class.