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

Posted

技术标签:

【中文标题】如何从头文件中访问类的私有成员?【英文标题】:How Can I Access The Private Member Of A Class From Within a Header File? 【发布时间】:2012-11-20 12:31:48 【问题描述】:

很抱歉这个问题的措辞如此尴尬,因为我不知道该怎么问。无论如何,我有一个名为“aItem”的类的实现文件和头文件,其中包含 aItem 对象的向量。

在名为“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

袋子.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 个警告 ===|

【问题讨论】:

【参考方案1】:

既然您已经拥有名称的公共访问器,为什么不使用它们呢?

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

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

const std::string& getName() const;

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

【讨论】:

谢谢!现在有另一个问题,但必须等待 20 分钟才能发布...>. 【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何从头文件中访问类的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章

Friend函数访问静态库中定义的类的私有成员

访问同一文件中类的私有成员的函数

我必须在类的头文件中提及私有方法吗?

在仅拿到头文件的情况下,如何修改类中的私有成员值?

OC中在.h和.m中声明的属性和成员变量有何区别

Swift 中的友元类(访问内部类的私有成员)