通过 C++ 中的外部函数更改存储在另一个对象的向量中的对象中元素的值

Posted

技术标签:

【中文标题】通过 C++ 中的外部函数更改存储在另一个对象的向量中的对象中元素的值【英文标题】:Changing a value of an element in an object that is stored in a vector in another object through an external function in C++ 【发布时间】:2018-12-02 19:32:35 【问题描述】:

所以创建了一个名为“Item”的类,该类的对象在开始时将具有 100% 的条件,玩家在我告诉他时存储项目(在本例中名为“apple”)。在 degradeT 函数中,我想传递包含玩家迄今为止拾取的项目的整个向量,然后通过 chCond 函数将该向量中每个项目的条件更改为 -1。

第一个错误:

initial value of reference to non-const must be an lvalue

第二个错误:

'void degradeT(std::vector<Item,std::allocator<_Ty>> &)': cannot convert argument 1 from 'std::vector<Item,std::allocator<_Ty>>' to 'std::vector<Item,std::allocator<_Ty>> &'
#include "pch.h"
#include <iostream>
#include <string>
#include <vector>

using std::cout; using std::cin; using std::endl;
using std::string; using std::vector; using std::to_string;

class Item 

private:
    string name; // Item name
    float condition; // Item condition
    bool consumable; // Is the item consumable
public:
    Item() 
    Item(string a, float b, bool c)  name = a; condition = b; consumable = c; 
    Item(string a, bool c)  name = a; condition = 100.f; consumable = c; 

    string getName() 
        return name;
    
    float getCond() 
        return condition;
    
    bool isCons() 
        return consumable;
    
    void chCond(float a)  // Change Item condition
        condition += a;
    
;

//-----------------------

class Player 

private:
    vector<Item> plItems; // Item container
public:
    Player() 

    void pickUpItem(Item a)  // Adding Items to inventory
        plItems.push_back(a);
        cout << a.getName() << " added to inventory!\n";
    
    void checkItemConds()  // Checking condition of all items
        for (unsigned int a = 0, siz = plItems.size(); a < siz; a++) 
            cout << plItems[a].getName() << "'s condition is: " << plItems[a].getCond() << "%\n";
        
    
    Item returnItem(unsigned int a)  // Return a specific Item
        return plItems[a];
    
    int getCurInvOcc()  // Get cuurent inventory occupation
        return plItems.size();
    
    vector<Item> getPlItems()  // Return the vector (Item container)
        return plItems;
    
;

//-------------------------
void degradeT(vector<Item>& Itemss); // Degrade item after some time
//-------------------------

int main()

    Player me; // me
    string inp; // input
    int num = 1; // apple 1, apple 2, apple 3...

    while (inp != "exit") 
        cin >> inp;

        if (inp == "addApple") 
            Item apple(("apple " + to_string(num)), true);
            me.pickUpItem(apple);
            num++;
        

        if (inp == "checkItemConds") 
            me.checkItemConds();
        

        if (inp == "timeTick") 

            // This doesn't have anything to do with time I just want to test the function manually

            degradeT(me.getPlItems());
        

    

    system("PAUSE");
    return 0;


void degradeT(vector<Item> &Itemss) 

    for (unsigned int a = 0, siz = Itemss.size(); a < siz; a++) 
        Itemss[a].chCond(-1);
        cout << Itemss[a].getName() << endl;
    

【问题讨论】:

【参考方案1】:

我不确定您的问题是什么,但您的错误与函数void degradeT(vector&lt;Item&gt; &amp; Itemss) 有关。

此函数需要一个引用,但您传递的是一个 r 值。您可以使用getPlItems() 返回引用,也可以将左值传递给degradeT

【讨论】:

以上是关于通过 C++ 中的外部函数更改存储在另一个对象的向量中的对象中元素的值的主要内容,如果未能解决你的问题,请参考以下文章

C++ 成员函数作为外部库的回调函数

在另一个类中分配对象数组(C++)

C ++:如何访问另一个类中的类函数?

C++ 中的对象构造

如何在另一个模块中设置全局变量?

C++大纲及疑惑点三