【问题标题】:Value not updating in class C++ [duplicate]C ++类中的值未更新[重复]
【发布时间】:2021-11-25 09:43:23
【问题描述】:

我正在编写一个分配程序,它实现了旨在模拟选举的 OOP 原则。

我有一个班级聚会:

class Party{
public:
    Party(){};
    ~Party(){};
    Party(std::string name, int budget){partyName = name; electionBudget = budget;}
    std::string getPartyName(){return partyName;}
    std::string getLeaderName(){return leaderName;}
    std::string getManagerName(){return managerName;}

    int getElectionBudget(){return electionBudget;}
    void setElectionBudget(int budget){electionBudget = budget;}

    void setLeaderName(std::string lName){leaderName = lName;}
    void setManagerName(std::string mName){managerName = mName;}

    std::vector<Stance> getPartyStances(){return partyStance;}
    void setPartyStances(std::vector<Stance> pStance){partyStance = pStance;}

    void *leaderPtr;
    void *managerPtr;

    void setLeader(void *a){leaderPtr = a; }
    void setManager(void *a){managerPtr = a;}

    void spendMoneyOnEvent(int cost){
        int currentBudget = getElectionBudget();
        setElectionBudget(currentBudget - cost);
    }


    void print();

private:
    std::string partyName;
    std::string leaderName;
    std::string managerName;
    std::vector<Stance> partyStance;
    int electionBudget;
};

在一个大的 for 循环中,我每天都会像这样更新各方剩余的预算:

for(Party p : partiesVector){
            std::cout << p.getPartyName() << " budget remaining: " << "$" << p.getElectionBudget() << std::endl;
        }

我还在我的 main.cpp 中实现了代码,以在每次事件发生时更新预算。例如:

case 0:
        std::cout << debate.getEventName() << std::endl;
        std::cout << debate.getEventDecription() << std::endl;

        party1.spendMoneyOnEvent(500);

        std::cout << party1.debate.haveDebate(party1, party2, party3);
        break;

但是,无论我尝试设置什么或尝试更新变量,它始终保持不变(我声明它的内容)。这里有什么我不理解或遗漏的地方吗?

任何帮助将不胜感激,因为我对 C++ 还是比较陌生

谢谢!

【问题讨论】:

    标签: c++ oop variables


    【解决方案1】:

    for(Party p : partiesVector) 正在接收Party 对象按值,因此复制。对p 的任何更新都会更新副本,而不是原始版本。确保这样的循环接收到Party by reference

    for(Party &p : partiesVector)
    

    无论如何你都应该这样做,即使对于只读循环也是如此。

    更重要的是,您的显示循环是通过 Party 对象中的 vector 进行迭代,但您的更新代码直接更新不在 vector 中的 Party 对象。当您将Party 添加到vector 时,您可能制作了另一个副本。所以你应该改变你的更新代码来引用vector中的Party

    partiesVector[someIndex].spendMoneyOnEvent(500);
    

    或者更改vector 以保存指向您在vector 外部创建的Party 对象的指针。

    vector<Party*> partiesVector;
    ...
    Party party1;
    ...
    partiesVector.push_back(&party1);
    ...
    party1.spendMoneyOnEvent(500);
    ...
    for(Party *p : partiesVector) {...}
    

    【讨论】:

    • 完美,非常感谢您如此彻底地回答。我不知道我在用 C++ 制作副本,只是以为我在访问它
    • @DamonO'Neil C++ 基于值语义,而不是许多其他语言中的引用语义。如果你想要 C++ 中的引用语义,你必须明确它。
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2014-04-15
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多