首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建可以调用彼此共享成员变量的子类

创建可以调用彼此共享成员变量的子类
EN

Stack Overflow用户
提问于 2013-10-12 17:43:29
回答 5查看 930关注 0票数 1

我是C++的新手,在这方面我遇到了麻烦。因此,我正在尝试使用泛型子类来创建类,这些类可以相互调用对方的字段。

基本上,我试着制作一个游戏,其中有一个通用类型和三个类型,有优势/弱点,相互对抗。我真的只有在Java方面的经验,而且这类事情的翻译到c++不是为我点击

泛型类型分为三种类型:类型1、类型2、类型3。

泛型必须是具体的

在泛型类型中,有字段攻击、防御、命中点。

类型1、2和3都继承这些字段。

我试图在泛型类中创建一个虚拟函数:

virtual void attack(Generic* g);

问题是,例如,当我尝试制作type_1.attack(generic)时,我想做g->hitpoint来获得泛型的命中点,但是它在C++中似乎不是那样工作的。

此外,我知道我一定做错了什么,因为类型1、2和3都包含泛型类型的标头,但是如果我想在main.cpp中包含这3个标头,它会给我声明泛型3次的错误。

我该怎么做呢?

对不起,这是一个非常具体的问题,而且有点含糊。如果我需要澄清什么,请告诉我

编辑:下面是我所说的基本设置

//in generic.h

代码语言:javascript
复制
class Generic {
protected:
    int hitpoints;
    int strength;
    int defense;
public:
    virtual void attack(Generic* g);
};

//type1.h
#include 'generic.h'
class Type1 : public Generic {
    void attack (Generic* g);
};

//in type1.cpp
void Type1::attack(Generic*g) {
    g->hitpoints = strength - g->defense;
}

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-12 18:09:47

对象可以访问从基类继承的自己的 protected成员。但是一个对象不能访问另一个对象的 protected成员。这是privateprotected - private成员之间的区别--private成员只能由声明它们的类访问,但是声明类及其后代可以访问protected成员。不过,这两种代码都对外部代码仍然是保密的。

要做您正在尝试的事情,hitpoints需要是public

票数 3
EN

Stack Overflow用户

发布于 2013-10-12 18:05:53

为了避免第二个问题(一个多次定义的类),有一种叫做包含守卫的东西(它们防止您多次包含同一个文件)。它的工作方式如下:

代码语言:javascript
复制
// File: type1.h
// At the very beginning
#ifndef type1_h
#define type1_h

// Here come the rest of your file and, at the end:

#endif

这样,文件的内容只包含一次,因为在此之后将定义type1_h,因此将跳过所有内容。这可能是#define在C++中唯一被普遍接受的使用。

至于第一个问题,protected意味着派生类可以为自己或自己类的对象读取该成员,但没有其他类。这包括派生类不能读取属于另一个类的对象(包括基类本身)的成员。恐怕你得重新考虑你的设计了。

您能做的最好的就是更改protected成员的隐私,或者更好的是提供public访问器并保留数据成员privatepublic数据成员在类中很少是一个好主意(结构是另一回事):

代码语言:javascript
复制
class Generic {
private:
    int hitpoints;
    int strength;
    int defense;
public:
    virtual void attack(Generic* g);

    void SetHitpoints(int hp) {hitpoints = hp;}
    int GetDefense() {return defense;}
};
票数 1
EN

Stack Overflow用户

发布于 2013-10-12 18:07:19

类型1、2和3都包含泛型类型的标头,但是如果我想在main.cpp中包含这3个标头,它会给我一个声明泛型3个单独时间的错误。

您需要确保类只声明一次。这通常是通过.h文件中的警卫完成的:

代码语言:javascript
复制
//generic.h
#ifndef GENERIC_H
#define GENERIC_H

//all declarations go here

#endif /* GENERIC_H */

键入#include "generic.h"时,C++处理器基本上只会粘贴foo.h的内容。由于您将它包含了三次(通过Type1、Type2和Type3类的包含,每个类都包含generic.h),所以该类被删除了三次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19337264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档