2014-11-24 37 views
0

首先解决的问题C++装饰 - 工作不正常

正如下面的答案浊,我错误地写了

#ifndef ICETOWER_H 
#define ICETOWER_H 

我仍然有一些问题,我的C++代码。

我实现了一个装饰图案为基本塔升级到冰塔2 *成本。但是当我运行它时,即使它已经装饰,它也显示两个塔的相同规格。任何人都知道我做错了什么?

以下是文件:

tower.h

#ifndef __TOWER_H__ 
#define __TOWER_H__ 

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

class Tower { 

private: 

    string type; 
    string effect; 
    int cost; 
    int sellTower; 
    int damage; 
    int range; 
    int rate; 

public: 

    string getType() { return type; } 
    string getEffect() { return effect; } 

    int getCost() { return cost; } 
    int getSale() { return sellTower; } 
    int getDamage() { return damage; } 
    int getRange() { return range; } 
    int getROF() { return rate; } 

    Tower(); 
    virtual ~Tower(){} 
}; 

#endif __TOWER_H__ 

tower.cpp

#include "Tower.h" 

Tower::Tower() 
{ 
    // Tower Type 
    this->type = "Basic"; 

    // Tower Special Effect 
    this->effect = "None"; 

    // Tower Cost 
    this->cost = 500; 

    // Tower Sell Cost 
    this->sellTower = 300; 

    // Tower Damage inflicted 
    this->damage = 50; 

    // Tower Range (paths) 
    this->range = 2; 

    // Tower rate of fire 
    this->rate = 0.5; 
}; 

TowerDecorator.h

#ifndef __TOWERDECORATOR_H__ 
#define __TOWERDECORATOR_H__ 
#include <iostream> 
#include <string> 
#include "Tower.h" 
using namespace std; 

class TowerDecorator : public Tower { 

private: 

    Tower *decoratedTower; 

public: 

    TowerDecorator(Tower *decoratedTower) 
    { 
     this->decoratedTower = decoratedTower; 
    } 

    string type() { return decoratedTower->getType(); } 
    string effect() { return decoratedTower->getEffect(); } 

    int getCost() { return decoratedTower->getCost(); } 
    int getSale() { return decoratedTower->getSale(); } 
    int getDamage() { return decoratedTower->getDamage(); } 
    int getRange() { return decoratedTower->getRange(); } 
    int getROF() { return decoratedTower->getROF(); } 

}; 

#endif __TOWERDECORATOR_H__ 

iceTower.h

#ifndef ICETOWER_H 
#define ICETOWER_H 

#include "TowerDecorator.h" 

class IceTower : public TowerDecorator { 

public: 
    IceTower(Tower *decoratedTower) : TowerDecorator (decoratedTower){} 

    int getCost(){return TowerDecorator::getCost() * 2;} 
}; 

#endif __ICETOWER_H__ 

Driver.cpp

#include "Tower.h" 
#include "TowerDecorator.h" 
#include "IceTower.h" 

void printTowerDetails(Tower* tower) 
{ 
    cout << endl << "This is a " << tower->getType() << " Tower" << endl; 
    cout << "Build Tower : " << tower->getCost() << " Coins" << endl; 
    cout << "Sell Tower : " << tower->getSale() << " Coins" << endl; 
    cout << "Tower Range : " << tower->getRange() << " paths" << endl; 
    cout << "Tower Rate Of Fire : " << tower->getROF() << " p/s" << endl; 
    cout << "Tower Special Effect : " << tower->getEffect() << "" << endl; 
} 

int main() { 

    Tower *t1 = new Tower(); 

    printTowerDetails(t1); 

    t1 = new IceTower(t1); 

    printTowerDetails(t1); 


} 

输出

图片:http://i.imgur.com/Ws018iV.png

error

+0

在Tower.h和TowerDecorator.h中,您定义的包含gaurds与第一个在你放在ifdef – sajas 2014-11-24 05:17:38

+0

@Jimmy看到我的回答有关你的错误更多。 – 2014-11-24 05:32:26

回答

0

至少有两个严重的错误。 第一个是您检查清单常量的定义后缀_H__但定义它们不带后缀:

#ifndef __TOWER_H__ 
#define __TOWER__ 

#ifndef __TOWERDECORATOR_H__ 
#define __TOWERDECORATOR__ 

第二个是,你忘了放课后分号的定义TowerDecorator

class TowerDecorator : public Tower { 
//... 
} 
+0

@kec - 我得到了2塔tho相同的输出。任何想法为什么装饰模式似乎没有工作。第二个输出的成本应该是1000 – Jimmy 2014-11-24 05:40:07

+0

Tower * t1 = new Tower(); \t printTowerDetails(t1); \t t1 =新的IceTower(t1); \t printTowerDetails(t1); – Jimmy 2014-11-24 05:40:41

+0

http://i.imgur.com/Ws018iV.png – Jimmy 2014-11-24 05:42:22

0

那么,你的第一个问题是你的包括警卫员的问题。它应该是:

#ifndef __TOWER_H__ 
#define __TOWER_H__ 

您可能还有其他问题。

顺便说一句,你不应该使用两个下划线开始,因为它们是保留名称。

+0

谢谢,它解决了主要问题,但我仍然得到这条线的错误(在主文章中添加它) – Jimmy 2014-11-24 05:33:41

+0

class IceTower:public TowerDecorator { – Jimmy 2014-11-24 05:34:19

+0

连续两个下划线在任何地方都是禁止的。 – Potatoswatter 2014-11-24 05:52:06

0

你的头gaurds不一致: -

#ifndef __TOWER_H__ 
#define __TOWER__ 

这应该是

#ifndef __TOWER_H__ 
#define __TOWER_H__ 

其次改变这种

#endif __TOWER_H__ 

#endif 
+0

带有双下划线的警卫是无效的,因为这样的标识符标记是为编译器保留的。一个正确的卫兵将是'TOWER_H'。 – Potatoswatter 2014-11-24 05:51:34

+0

但他还附加了两个下划线,这样不会有问题 – ravi 2014-11-24 05:55:40

+0

咦?尾随双下划线是第二个问题,与领先的一样。下划线的位置并不重要。 – Potatoswatter 2014-11-24 05:59:43