如何实现一个abstact类C ++

时间:2018-01-12 19:37:51

标签: c++ inheritance

我有以下抽象类:

class Shadowmourn : public Weapon 
{
  public:
    ShadowMourn() : Weapon(std::string("Shadowmourn")) {}

    void attack() const override {}
}

一个简单的实现

Weapon *w = new Shadowmourn();
std::cout << "got " << w->getName() << std::endl;
std::cout << "got " << w->getName().c_str() << std::endl;

我可以编译它,但是当我尝试打印我的devired类的名字时,我得到了一些奇怪的字符。

// return the great power-of-10 less than n
unsigned long p10(unsigned long n) {
  if (n < 10) {
    return 1;
  }
  return p10(n/10) * 10;
}

unsigned long GetReverse(unsigned long n) {
  if (n < 10) {
    return n;
  }
  // OPs code
  //return  10 * GetReverse(n / 10) + n % 10;

  //     v----------------v------------------- scale by 1
  //     |                |   v-----------v--- scale by a power of 10 <= n
  return GetReverse(n / 10) + p10(n)*(n%10);
}

两个输出都不是预期的..我有一些不可读的字符..那么我的Weapon类的实现是不是很糟糕?

1 个答案:

答案 0 :(得分:10)

您调用未定义的行为,因为您存储了对MATCH path = (a)-[*0..4]->(b) WHERE NOT ()-->(a) AND (LENGTH(path) = 4 OR NOT (b)-->()) RETURN path; 的引用,即使包含std::string的内容仍然被销毁,然后您尝试访问已经销毁的Weapon。< / p>

奇怪的输出是在这种情况下可能发生的许多不可预测的事情之一。

解决方案是让您的代码更简单:不要存储std::string,而是std::string const&

std::string const

您还需要一个虚拟析构函数,您可能希望摆脱数据成员的下划线约定。而你可能只想让class Weapon { public: Weapon(std::string const &name) : _name(name) {} virtual void attack() const = 0; std::string const &getName() const; private: std::string const _name; }; 按值返回,以避免悬空引用的进一步麻烦。虽然我们正在使用它,但具有虚函数的类总是适合删除的复制构造函数和复制赋值运算符。

getName