【问题标题】:C++ Decorator - Not working properlyC++ 装饰器 - 无法正常工作
【发布时间】:2014-11-24 05:13:17
【问题描述】:

第一个问题已解决

正如下面的答案所说,我写错了

#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

【问题讨论】:

  • 在 Tower.h 和 TowerDecorator.h 中,您定义的 include gaurd 与您放入 ifdef 中的不同
  • @Jimmy 查看我对您的另一个错误的回答。

标签: c++ decorator


【解决方案1】:

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

#ifndef __TOWER_H__
#define __TOWER__

#ifndef __TOWERDECORATOR_H__
#define __TOWERDECORATOR__

第二个是你忘了在TowerDecorator的类定义后面加分号

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

【讨论】:

  • @kec - 我得到了 2 座塔的相同输出。知道为什么装饰器模式似乎不起作用。第二个输出的成本应该是 1000
  • 塔 *t1 = new Tower();打印塔详细信息(t1); t1 = 新冰塔(t1); printTowerDetails(t1);
  • 谢谢 - 它现在可以工作,但装饰器似乎没有 wrk 。它为两个输出显示相同的规格
  • @Jimmy 函数 getCost 是否应该在 Tower 类中声明为虚拟函数?
【解决方案2】:

嗯,您遇到的第一个问题是您的包含防护有问题。应该是:

#ifndef __TOWER_H__
#define __TOWER_H__

您可能还有其他问题。

顺便说一句,您不应该使用以下划线开头的名称,因为它们是保留的。

【讨论】:

  • 谢谢,它解决了主要问题,但我仍然收到此行错误(在主帖中添加)
  • 类 IceTower : public TowerDecorator {
  • 禁止在任何地方使用两个连续的下划线。
【解决方案3】:

你的标题不一致:-

#ifndef __TOWER_H__
#define __TOWER__

这应该是

#ifndef __TOWER_H__
#define __TOWER_H__

第二次改变这个

#endif __TOWER_H__

#endif

【讨论】:

  • 包含双下划线的保护是无效的,因为这样的标识符标记是为编译器保留的。正确的守卫是TOWER_H
  • 但是他还附加了两个下划线,所以这不是问题
  • 嗯?尾随双下划线是第二个问题,与前导问题相同。下划线的位置不重要。
猜你喜欢
  • 2019-05-17
  • 2021-01-06
  • 2015-11-09
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多