我一直在尝试创建一个函数getLocation()
,它利用一个指针返回Location
类中声明的struct Character
的值。我很好奇我的语法(或我的结构)的问题。知道星号*
应该引用该值,为什么我的函数使用&符号string& Character::getInventory
能够返回该特定索引的值(它的返回不需要转换)?
尝试Location& Character::getLocation() {return position; }
运行时导致error C2679: binary '<<': no operator found
也不
Location*
由于没有转换,因此无法运行。
我读到以下内容可能是最合适的,因为它指定了结构所在的范围,但仍导致需要并返回临时。
Character::Location* const & Character::getLocation() {return &position; }
非常感谢任何建议或意见,提前感谢。
下面是我的main.cpp,当然会显示Location
的十六进制地址。
#include <iostream>
#include <string>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::string;
class Character {
private:
string name;
string inventory[4];
public:
struct Location {
int x; int y;
};
Location position;
public:
void Character::setName(string x) { name = x; }
string Character::getName() { return name; }
void Character::setLocation(int x, int y) {
position.x = x; position.y = y;
}
Location* Character::getLocation() {return &position; }
void Character::setInventory(string(&x)[4]) { for (int i = 0; i < 4; ++i) { inventory[i] = x[i]; } }
string& Character::getInventory(int itemNumber) { return inventory[itemNumber]; }
};
void showUser(Character Character);
int main() {
try {
string items[4] = { "Sword", "Shield", "Potion", "Cloak" };
Character CharacterI;
CharacterI.setName("Some Character");
CharacterI.setInventory(items);
CharacterI.setLocation(1, 30);
cout << "\n" << "Retrieving Character Info..." << "\n" << endl;
showUser(CharacterI);
}
catch (std::exception & e) {
cerr << "\nError : " << e.what() << '\n';
}
system("pause");
return 0;
}
void showUser(Character character) {
cout << "Name : " << character.getName() << endl;
cout << "Location : " << character.getLocation() << endl;
for (int i = 0; i < 4; ++i) {
cout << "Inventory " << i + 1 << " : " << character.getInventory(i) << endl;
}
}
答案 0 :(得分:1)
好的,我想我现在更好地理解了这个问题。 getInventory
可以成功返回引用的原因getLocation
不是因为getLocation
返回对临时变量的引用,这是不好的。有关详细信息,请参阅@ NathanOliver评论中的链接。另外,为了解释@Peter Schneider先前的注释,表达式中的*
取消引用指针以返回值,而在声明中它表示变量将是指针类型。这两种用法或多或少是彼此对立的。例如:
int* p = new int; //Declares a pointer to int
int x = *p; //Dereferences a pointer and returns an int
您需要做的是创建一个成员变量来保存角色的位置,然后设置/获取该变量而不是创建临时变量。您已为name
和inventory
执行了此操作,只是继续使用相同的模式。
此外,每当您在Location
类范围之外使用Character
结构时,您需要使用Character::Location
对其进行完全限定。
示例:
#include <iostream>
using namespace std;
class Character {
public:
struct Location {
int x;
int y;
};
Location loc;
void SetLocation(int x, int y) {loc.x = x; loc.y = y;}
Location& GetLocation() {return loc;}
};
int main ()
{
Character c;
c.SetLocation(1,42);
Character::Location l = c.GetLocation();
cout << l.x << endl << l.y << endl;
return 0;
}
输出:
1
42