C++ 从类外给类中的变量赋值

C++ 从类外给类中的变量赋值,c++,C++,我在尝试在函数中的类之外分配在类值中声明的变量时遇到问题。示例如下: class player { public: string playerWeapon; void setWeapon(); } 然后可能在cpp文件中声明的头文件之外: void player::setWeapon(){ player playerobj; int playerWeaponInt; cout << "choose Number" << endl << "'1' f

我在尝试在函数中的类之外分配在类值中声明的变量时遇到问题。示例如下:

class player {
public:
string playerWeapon;
void setWeapon();
}
然后可能在cpp文件中声明的头文件之外:

void player::setWeapon(){
player playerobj;
int playerWeaponInt;
cout << "choose Number" << endl
     << "'1' for gun" << endl
     << "'2' for axe" << endl;
     cin >> playerWeaponInt;
但是,无论我稍后在程序中尝试显示它,变量都是空的,没有显示任何内容。有人能帮我吗

编辑:这里有一段额外的代码,可以编译

player playerObj;
main(){
playerObj.setWeapon; 
}

问题在于
setwearm
中的第一行代码:

player playerobj;
这将创建另一个玩家对象。显然,您想设置当前玩家的当前武器,代码应该是:

void player::setWeapon(){
    cout << "choose Number" << endl
         << "'1' for gun" << endl
         << "'2' for axe" << endl;
    cin >> playerWeaponInt;
    if(playerWeaponInt == 1){
        playerWeapon = "gun"; // NOTE: no "playerobj."
    } else if (playerWeaponInt == 2){
        playerWeapon = "axe";
    }
}
void player::setwearm(){

cout问题在于
setarm
中的第一行代码:

player playerobj;
这将创建另一个玩家对象。显然,您要设置当前玩家的当前武器,代码应该是:

void player::setWeapon(){
    cout << "choose Number" << endl
         << "'1' for gun" << endl
         << "'2' for axe" << endl;
    cin >> playerWeaponInt;
    if(playerWeaponInt == 1){
        playerWeapon = "gun"; // NOTE: no "playerobj."
    } else if (playerWeaponInt == 2){
        playerWeapon = "axe";
    }
}
void player::setwearm(){

cout首先,你不应该通过使你的
类播放器的内部数据
playerWeapon
来暴露它的内部表示。最好制定一种方法来设置并使数据私有化。建议:

class player {
public:
    void setPlayerWeapon(const string &playerWeapon);
    void setWeapon();
private:
    string playerWeapon;
}
接下来,您想在何处显示playerobj.playerWeapon的内容?因为
player::setWeapon
有一个自己的对象
playerobj
,当离开该方法时,该对象将被销毁,您只能在当前方法调用中显示它。这可能不是您想要做的。我假设您想设置
playerWeapon。如果是,只需删除辅助对象

player playerobj
从方法中删除,并将武器字符串直接分配给objects成员变量。

首先,您不应该通过将
类播放器的内部数据设置为
playerwapon
来公开其内部表示。最好制定一种方法,将数据设置为私有。建议:

class player {
public:
    void setPlayerWeapon(const string &playerWeapon);
    void setWeapon();
private:
    string playerWeapon;
}
接下来,您想在何处显示playerobj.playerWeapon的内容?因为
player::setWeapon
有一个自己的对象
playerobj
,当离开该方法时,该对象将被销毁,您只能在当前方法调用中显示它。这可能不是您想要做的。我假设您想设置
playerWeapon。如果是,只需删除辅助对象

player playerobj
从方法中删除,并将武器字符串直接分配给objects成员变量。

请用encapsulation@NathanOliver这就是那个例子,这不是我的代码,但我很快就为这个问题编写了一个例子,也许要花更多的时间来制定这个问题关于如果我们没有看到导致问题的代码,我们如何告诉您代码有什么问题?我们可以猜测并告诉您检查这个和那个,但这不是堆栈溢出的工作方式。您提出了一个具体的问题,您(希望)得到了具体的答案请用一句话回答你的问题,或者请仔细阅读encapsulation@NathanOliver这就是那个例子,这不是我的代码。但是我很快就为这个问题写了一个例子。也许要花更多的时间来阐述这个问题。如果我们没有看到真正导致问题的代码,我们如何告诉您代码出了什么问题呢可以猜测并告诉您检查这个和那个,但堆栈溢出不是这样工作的。您提出了一个具体的问题,并且(希望)得到了具体的答案嗨,我想在class@Spartan5434因此,请从
setwearm
中删除本地
playerobj
。添加一个访问器方法
string getPlayerWeapon()常量{return playerWeapon;}
访问您的类以获得对
播放器
类之外的访问权。您好,我想在class@Spartan5434因此,请从
setwearm
中删除本地
playerobj
。添加一个访问器方法
string getPlayerWeapon()常量{return playerWeapon;}
访问你的类以获得对
player
类之外的访问权。需要明确的是,这是setarm方法中应该删除的
player playerobj
。否则,你将创建一个临时player对象,该对象仅存在于该方法中。@matli:事实上,重新编码后更清晰,这就是
pla你的玩家对象在SetLanguar方法中应该被删除。否则,你将创建一个临时玩家对象,该对象仅存在于该方法中。@matli:事实上,重新编写后更清晰