我是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
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;
}
发布于 2013-10-12 18:09:47
对象可以访问从基类继承的自己的 protected成员。但是一个对象不能访问另一个对象的 protected成员。这是private和protected - private成员之间的区别--private成员只能由声明它们的类访问,但是声明类及其后代可以访问protected成员。不过,这两种代码都对外部代码仍然是保密的。
要做您正在尝试的事情,hitpoints需要是public。
发布于 2013-10-12 18:05:53
为了避免第二个问题(一个多次定义的类),有一种叫做包含守卫的东西(它们防止您多次包含同一个文件)。它的工作方式如下:
// 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访问器并保留数据成员private。public数据成员在类中很少是一个好主意(结构是另一回事):
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;}
};发布于 2013-10-12 18:07:19
类型1、2和3都包含泛型类型的标头,但是如果我想在main.cpp中包含这3个标头,它会给我一个声明泛型3个单独时间的错误。
您需要确保类只声明一次。这通常是通过.h文件中的警卫完成的:
//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),所以该类被删除了三次。
https://stackoverflow.com/questions/19337264
复制相似问题