我不知道为什么这个代码崩溃了,它对我来说是正确的,但它只是与SIGSEV
崩溃。我来自Java并习惯于“有用”的错误消息......
的main.cpp
#include <cstdlib>
#include <stdio.h>
#include "DuckV.h"
#include "PenguinV.h"
bool tryFlyOOP(IBird* birdy)
{
return birdy->canFly();
}
int main(int argc, char** argv)
{
DuckV* duckV;
PenguinV* penguinV;
printf("My OOP duck %s fly\n", tryFlyOOP(duckV) ? "can" : "can't");
printf("OOP Penguins %s fly\n", tryFlyOOP(penguinV) ? "can" : "can't");
return 0;
}
IBird:
#ifndef IBIRD_H
#define IBIRD_H
class IBird
{
public:
IBird () {}
virtual bool canFly() {return true;};
};
#endif /* IBIRD_H */
除了名称和返回值之外,DuckV / PenguinV是相同的
#ifndef DUCKV_H
#define DUCKV_H
#include "IBird.h"
class DuckV : public IBird
{
public:
DuckV(){}
virtual bool canFly() {return true;}
};
#endif /* DUCKV_H */
我已经尝试过改变一些东西,我只是不明白。任何帮助将不胜感激:)。
答案 0 :(得分:4)
您尚未初始化指针:
DuckV* duckV; // points to a random location. No DuckV object exists.
我建议你放弃指针,做一下这样的事情:
bool tryFlyOOP(const IBird& birdy)
{
return birdy.canFly();
}
然后
DuckV duckV;
std::cout << "My OOP duck " << (tryFlyOOP(duckV) ? "can" : "can't") << " fly\n";
这需要您制作canFly()
成员函数const
:
class IBird
{
public:
IBird () {}
virtual bool canFly() const {return true;};
};
答案 1 :(得分:2)
这是因为没有创建对象。
你应该这样做:
DuckV* duckV = new DuckV();
PenguinV* penguinV = new PenguinV();
在您的代码中,您刚刚声明了指针。
或者你可以这样做:
DuckV duckV;
PenguinV penguinV;
bool tryFlyOOP(const IBird& birdy)
{
return birdy.canFly();
}
在最后一个例子中,你使用引用,这也是一个很好的方法。
答案 2 :(得分:0)
您尚未初始化变量(duckV和penguinV)。由于您希望将它们用作指针,因此使用“new”运算符创建新对象并将其分配给这些变量。或者 - 更好的其他 - 在堆栈上创建它们并传递引用。