如何从头文件中访问类的私有成员?

时间:2012-11-20 12:31:48

标签: c++ function inheritance vector

我很抱歉这个问题措辞太笨拙,因为我不知道如何问这个问题。无论如何,我有一个名为“aItem”的类的实现文件和标题,它包含一个aItem对象的向量。

在第二个名为“bag”的文件中,我希望能够列出上述向量的所有元素。我最初把“bag”分成了一个标题和实现文件,但是编译器在“我声明”之前提出了“未声明的引用”,直到我将这两个文件组合在一起。在任何情况下,该部分都在工作。

我希望bag.h(更具体地说,addItem函数)能够访问所创建项目的m_itemName变量。

aItem.cpp:

//aItem .cpp implementation file
#include "aItem.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//setting this up default
aItem::aItem()
{
    m_itemName = "Default Name";
    m_itemType = "Default Type";
    m_damage     = 9001;
}





void aItem::setName(string name)
{
    m_itemName = name;
}

void aItem::setType(string type)
{
    m_itemType = type;
}

void aItem::setDamage(int damage)
{
    m_damage = damage;
}

string aItem::getName()
{
    return m_itemName;
}

string aItem::getType()
{
    return m_itemType;
}

int aItem::getDamage()
{
    return m_damage;
}

aItem.h:

#ifndef AITEM_H_INCLUDED
#define AITEM_H_INCLUDED

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class aItem
{
public:
    //constructor
    aItem();


    //Methods
    void ItemCreate(string itemName, string itemType, int damage);
    void setName(string name);
    void setType(string type);
    void setDamage(int damage);
    string getName();
    string getType();
    int getDamage();

private:

    string  m_itemName;
    string  m_itemType;
    int m_damage;


};

#endif // AITEM_H_INCLUDED

bag.h:

#ifndef BAG_H_INCLUDED
#define BAG_H_INCLUDED

#include "aItem.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class aItem;

class bag : public aItem
{
public:
    //constructor
    bag();

    //methods
    //void delItem(aItem aitem);

void addItem(aItem var)
    {
        m_items.push_back(var);
    }

void bagList()
    {
        for( vector<aItem>::size_type index = 0; index < m_items.size(); index++ )
            {
                //Makes a numerical list.
                cout << "Item " << index + 1 << ": " <<  m_items[index].m_itemName << endl;
                index+= 1;
            }
    }
private:
     vector<aItem> m_items;
};

#endif // BAG_H_INCLUDED

...最后,main.cpp:

// WHYGODWHY.cpp : Defines the entry point for the console application.
//

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

int main()
{
    aItem woodSword;
    woodSword.setName("Wooden Sword");
    woodSword.setDamage(3);
    woodSword.setType("WPN");

    bag inventory;
    inventory.addItem(woodSword);
    inventory.bagList();


    cout << "Name: " << woodSword.getName() << endl;
    cout << "Type: " << woodSword.getType() << endl;
    cout << "Damage: " << woodSword.getDamage() << endl;
    //cout << "Inv: " <<
    int pause = 0;
    cout << "Pause!";
    cin >> pause;

    return 0;
}

编辑:这是错误消息: C:\ Users \ dmarr \ Documents \ CSharper \ Dallas \ CPlusPlus \ WHYGODWHYCB \ aItem.h ||在成员函数'void bag :: bagList()'中: C:\ Users \ dmarr \ Documents \ CSharper \ Dallas \ CPlusPlus \ WHYGODWHYCB \ aItem.h | 28 |错误:'std :: string aItem :: m_itemName'是私有的| C:\ Users \ dmarr \ Documents \ CSharper \ Dallas \ CPlusPlus \ WHYGODWHYCB \ bag.h | 32 |错误:在此上下文中| || ===构建完成:2个错误,0个警告=== |

3 个答案:

答案 0 :(得分:2)

由于您已经拥有该名称的公共访问者,为什么不使用它们?

cout << "Item " << index + 1 << ": " <<  m_items[index].getName() << endl;

考虑将访问者更改为const并返回const引用:

const std::string& getName() const;

除此之外还有其他问题。特别是,C ++中的容器不容纳多态对象,因此std::vector<aItem>只能容纳aItem(但不能容纳bag个对象)。在一个完全不同的层面上,重新考虑您的命名约定,将类型(这是不同对象的类别)命名为aItem这意味着 Item 的一个实体是没有意义的。这也与名称bag ...

不一致

答案 1 :(得分:1)

使用班级的公共界面。所以不要使用

cout << "Item " << index + 1 << ": " <<  m_items[index].m_itemName << endl;

cout << "Item " << index + 1 << ": " <<  m_items[index].getName() << endl;

答案 2 :(得分:1)

我建议调用getName()方法而不是直接访问类的成员。 另外,在这种情况下,为什么bag继承自aItem? 如果我正确理解您要执行的操作,bag不是aItem,那么它不应该从aItem继承,并且应该使用访问方法而不是直接成员访问。 作为替代方案,您可以根据WhozCraig的建议将bag声明为aItem的朋友。