You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类外部实现的函数中为类成员变量赋值的问题求助

解决类成员函数中赋值成员变量的问题

嘿,我一眼就看到你代码里的问题啦!你在setWeapon成员函数里创建了一个新的player局部对象playerobj,但这个对象和调用setWeapon的那个实例完全没关系——你要是给这个局部对象的playerWeapon赋值,修改的只是这个临时对象,函数执行完它就被销毁了,真正需要修改的对象的成员变量根本没动。

先看修正后的完整代码

头文件(比如player.h)

#include <string>
using namespace std;

class player {
public:
    string playerWeapon;
    void setWeapon();
};

实现文件(player.cpp)

#include "player.h"
#include <iostream>
using namespace std;

void player::setWeapon(){
    int playerWeaponInt;
    cout << "choose Number" << endl << "'1' for gun" << endl << "'2' for axe" << endl;
    cin >> playerWeaponInt;

    // 直接访问当前对象的成员变量,不需要创建新对象
    if (playerWeaponInt == 1) {
        playerWeapon = "gun";
        // 也可以写成 this->playerWeapon = "gun"; 效果完全一样,this指针指向当前调用函数的对象
    } else if (playerWeaponInt == 2) {
        playerWeapon = "axe";
    } else {
        // 处理无效输入,给个默认值或者提示
        cout << "Invalid choice! Setting default weapon: knife" << endl;
        playerWeapon = "knife";
    }
}

为什么原来的代码不对?

举个例子,假设你在main里这样调用:

int main() {
    player myPlayer;
    myPlayer.setWeapon(); // 调用myPlayer的setWeapon方法
    cout << myPlayer.playerWeapon << endl; // 原来的代码这里会输出空字符串,因为myPlayer的playerWeapon没被修改
    return 0;
}

你在setWeapon里创建的playerobj是函数内部的局部变量,和myPlayer是两个独立的对象。修改playerobj的成员变量,不会影响myPlayer的任何属性。

额外小建议(可选但推荐)

实际项目里最好把成员变量设为private,然后提供getter方法来访问,这样能保证封装性,比如:

class player {
private:
    string playerWeapon; // 私有成员
public:
    void setWeapon();
    string getWeapon() const { return playerWeapon; } // getter方法
};

这样外部代码只能通过getWeapon()获取武器,避免直接修改成员变量,让代码更健壮。

内容的提问来源于stack exchange,提问作者user7583245

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:48:32