我有以下抽象类:
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类的实现是不是很糟糕?
答案 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