【问题标题】:Accessing variables from other classes (C++)从其他类访问变量 (C++)
【发布时间】:2016-10-25 05:49:52
【问题描述】:

我一直在尝试从主类中访问一系列整数,然后在方法中显示它们。

但是,由于我自己的语言不熟练,我已经在这方面遇到了一些麻烦,因为我已经很久没有编码了。

经过相当多的搜索,我找不到任何可以帮助我的东西。如果可能的话,我该怎么做呢?

#include "inventory.h"

inventory::inventory(){
    int maxhealth = 100;
    int maxmana = 0;

    int health = 100;
    int mana = 0;
    int level = 1;

    int agility = 1;
    int strength = 1;

    int healthpotions = 0;
    int manapotions = 0;

    int armourlevel = 0;
    int weaponlevel = 0;

    int crystals = 0;

    int gold = 0;
    int rock = 0;
    int wood = 0;
}

string inventory::getinv(){
    return inventory; //I know this sort of return thing won't work, just a placeholder until I figure out what to do.
}

这是我迄今为止一直在使用的,但我什至很难让它不显示“成员'X'没有在这个构造函数中初始化。”我显然做错了什么。

Inventory.h:

#ifndef INVENTORY_H_
#define INVENTORY_H_

#include <iostream>

class inventory{
private:
    int maxhealth;
    int maxmana;

    int health;
    int mana;
    int level;

    int agility;
    int strength;

    int healthpotions;
    int manapotions;

    int armourlevel;
    int weaponlevel;

    int crystals;

    int gold;
    int rock;
    int wood;

public:
    inventory();
    string getinv();
};
#endif /* INVENTORY_H_ */

编辑:感谢到目前为止的帮助,我已经能够摆脱大部分错误。唯一剩下的是“..\src\zoria.cpp:1616:36: error: 'rock' was not declared in this scope”

【问题讨论】:

  • 请贴一些代码说明问题。
  • ..\src\inventory.cpp: At global scope: ..\src\inventory.cpp:34:23: error: no 'int inventory::getinv()' member function declared in class 'inventory' int inventory::getinv(){ 是我从中得到的常见错误形式。这就是你要找的东西吗?
  • 你需要修改它们的值还是只显示它们?
  • 不足以发布inventory类的完整定义。
  • 您的问题出在inventory.h 类中,我可以通过查看您发布的错误来说明这一点。请发布,以便我指出错误。

标签: c++ class variables integer


【解决方案1】:

你不需要构造函数中的类型来访问成员变量,否则编译器会认为你正在尝试声明新的局部变量。

这是inventory.cpp 文件的基本更正:

#include "inventory.h"

inventory::inventory(){ // this is the constructor
    maxhealth = 100;
    maxmana = 0;

    health = 100;
    mana = 0;
    level = 1;

    agility = 1;
    strength = 1;

    healthpotions = 0;
    manapotions = 0;

    armourlevel = 0;
    weaponlevel = 0;

    crystals = 0;

    gold = 0;
    rock = 0;
    wood = 0;
}

string inventory::getinv(){
    return "inventory"; //I know this sort of return thing won't work, just a placeholder until I figure out what to do.
}

注意添加到占位符 (return "inventory") 中的 "" 以使其成为有效的 string

注意:如果没有类的对象,您不能直接访问类中的变量,即使它被声明为 public(static 是唯一的例外)。但是,您已将所有成员变量声明为 private,因此需要 getter 和 setter 函数来访问它们的值。

编辑:

类就像包含东西的容器。但是,一个类的定义就像一个模板,可以用来创建该类型的对象。对象的实际存在发生在你写inventory someobject;时。

现在每个类都有一个称为构造函数的特殊函数,它以类本身的名称命名,并在声明该类的对象时立即调用。可以在构造函数中初始化类的所有成员变量。

要访问类的成员,您必须使用. 点运算符。如果需要在类主体之外直接访问成员,则必须将其声明为 public

所以你像这样改变类定义:

inventory.h:

#ifndef INVENTORY_H_
#define INVENTORY_H_
class inventory{
public:

    int maxhealth;
    int maxmana;

    int health;
    int mana;
    int level;

    int agility;
    int strength;

    int healthpotions;
    int manapotions;

    int armourlevel;
    int weaponlevel;

    int crystals;

    int gold;
    int rock;
    int wood;

    inventory();
    void printinv();
};
#endif /* INVENTORY_H_ */

inventory.cpp:

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

inventory::inventory()
{
    maxhealth = 100;
    maxmana = 0;

    health = 100;
    mana = 0;
    level = 1;

    agility = 1;
    strength = 1;

    healthpotions = 0;
    manapotions = 0;

    armourlevel = 0;
    weaponlevel = 0;

    crystals = 0;

    gold = 0;
    rock = 0;
    wood = 0;
}

void inventory::printinv(){
    cout << "LEVEL:           " << level << endl;
    cout << "HEALTH:          " << health << endl;
    cout << "MANA:            " << mana << endl;
    cout << "AGILITY:         " << agility << endl;
    cout << "STRENGTH:        " << strength << endl;
    cout << endl;
    cout << "HEALTH POTIONS:  " << healthpotions << endl;
    cout << "MANA POTIONS:    " << manapotions << endl;
    cout << endl;
    cout << "ARMOUR LEVEL:    " << armourlevel << endl;
    cout << "WEAPON LEVEL:    " << weaponlevel << endl;
    cout << "CRYSTALS:        " << crystals << endl;
    cout << endl;
    cout << "GOLD:            " << gold << endl;
    cout << "ROCK:            " << rock << endl;
    cout << "WOOD:            " << wood << endl;
}

现在在main中声明类的对象,比如:

inventory inv;

并访问每个成员变量(例如maxhealthmaxmanahealthmanalevelagilitystrengthhealthpotionsmanapotions、@987654 、weaponlevelcrystalsgoldrockwood) 喜欢:

inv.gold = 10;
inv.rock++;

等等。贯穿整个代码。

要显示库存,请将所有多余的显示代码替换为:

inv.printinv();

无处不在。

请参阅zoria.cpp here,我已对所有显示代码进行了更改,并更改了以下变量的访问权限:maxhealthmaxmanahealthhealthpotions,其余部分您也必须这样做变量如:manalevelagilitystrengthmanapotionsarmourlevelweaponlevelcrystalsgoldrockrock。 >

希望这会有所帮助。告诉您是否还有其他问题。

【讨论】:

  • using namespace std; 是不好的做法,don't encourage it
  • @Rakete1111 谢谢我不知道这个。
  • 那么命名空间 std 的替代方案是什么?我需要创建自己的命名空间吗?
  • @DeiniolL 我已从我的答案中删除了该建议,因为它微不足道,并且没有解决实际错误。它也被劝阻了,所以不用担心。
  • @DeiniolL 然后在getinv方法中添加cout&lt;&lt;"GOLD: ("&lt;&lt;gold&lt;&lt;")";等代码,然后像inv.getinv();一样调用它,就这么简单。现在有什么问题?
【解决方案2】:

在 Inventory.h 中定义成员变量(maxhealth、maxmana 等),在 Inventory.cpp 中,您应该在其构造函数中声明它们。问题是您正在重新声明它们。尝试从构造函数中的每个变量中删除“int”,因为您只需要在定义变量时指定类型。

【讨论】:

  • 在 C++ 中声明和定义是两个不同的概念。在这种情况下,您希望为“define”的最后一个实例“声明”
【解决方案3】:

这里有几点:

  1. 在您的构造函数中,您通过方法本地重新定义同名变量来隐藏实例变量。请查看如何在构造函数中初始化实例成员变量。

  2. 您尝试使用 getinv() 方法的签名将 inventory 类的实例隐式转换为 std::string,但您尚未为此类转换定义任何运算符。

  3. (可能与(2)有关)根据您发布的错误,我假设您正在使用getinv() 类似

    inventory my_inventory{};
    int inv = my_inventory.getinv();
    

    这不起作用,因为没有定义从 std::stringint 的隐式转换。将inventory::getinv() 的返回类型更改为int 并在那里返回一个实际的int

【讨论】:

  • 除了“'exampleint'没有在这个范围内声明”错误之外,这已经修复了所有这些错误,这仍然是一个巨大的改进。
  • 请阅读 C++ 中的成员访问级别(即publicprotectedprivate)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多