指针函数返回Class中的Struct值

时间:2015-09-15 16:54:38

标签: c++ function class pointers struct

我一直在尝试创建一个函数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;
    }
}

1 个答案:

答案 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

您需要做的是创建一个成员变量来保存角色的位置,然后设置/获取该变量而不是创建临时变量。您已为nameinventory执行了此操作,只是继续使用相同的模式。

此外,每当您在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