如何在类中使用结构

Posted

技术标签:

【中文标题】如何在类中使用结构【英文标题】:how to use struct in a class 【发布时间】:2017-04-19 14:24:42 【问题描述】:

lifeform.h

class lifeform

  public:
    struct item;
    void buyItem(item &a);
   //code..
; 

lifeform.cpp

struct lifeform::item

std::string type,name;
bool own;
int value,feature;

    item(std::string _type,std::string _name,int _value,int _feature):type(_type), name(_name),value(_value),feature(_feature)
     
        own=false;
     
;

lifeform::item lBoots("boots","Leather Boots",70,20);

void lifeform::buyItem(item &a)

if(a.own==0)


    inventory.push_back(a);
    a.own=1;
    addGold(-a.value);
    std::cout << "Added " << a.name << " to the inventory.";

    if(a.type=="boots")
    
        hp-=inventory[1].feature;
        inventory[1]=a;
        std::cout << " ( HP + " << a.feature << " )\n";
        maxHp+=a.feature;
        hp+=a.feature;
    
    

到目前为止没有错误,但是当我想像这样在 main.cpp 中使用它们时

 #include "lifeform.h"
 int main()
 
 lifeform p;
 p.buyItem(lBoots);
 

编译器说我 [错误] 'lBoots' 没有在这个范围内声明,但我声明它类我错过了什么吗?

【问题讨论】:

分享一下IGauntlets是什么可能是相关的。 我没有看到lGauntlets 的任何定义。你的意思是lBoots?您需要声明在头文件中,否则其他translation unit不会知道。 @RedPotato 请记住,structclass 在 C++ 中确实是同一回事。唯一的区别是结构默认访问级别是公共的,所以继承和成员默认是公共的,而类默认级别是私有的。除此之外,没有任何区别。 @Someprogrammerdude 是的,是的,它的 lBoots 【参考方案1】:

要使用您的lifeform::item lBoots,您需要在 main 中声明它:

#include "lifeform.h"

extern lifeform::item lBoots; // <-- you need this.

int main()

    lifeform p;
    p.buyItem(lBoots);

或者您应该将extern lifeform::item lBoots; 放在您的lifeform.h 中。

【讨论】:

op 的问题不是lifeform::item 是一个不完整的类型,而是将lBoots 作为外部变量暴露在他的头中。 @GuillaumeRacicot lifeform::item 没有问题,问题是我在 class.cpp 中声明了lBoots 但不能在 main.cpp @GuillaumeRacicot 是的,我现在看到了,我认为问题已被编辑。 @RedPotato 我更新了答案,您需要在 main.cpp 中声明 lBoots 才能引用它。 @Pavel extern lifeform::item lBoots 的声明属于lifeform.h。编辑它,赞成票是你的。

以上是关于如何在类中使用结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在类外设置结构值?

如何在类中使用 Pyomo 装饰器

如何在类中定义装饰器?

如何在类中有函数指针?

如何在类中使用受保护的类型继承?

如何在android中使用Dagger在类中进行单例注入