gpt4 book ai didi

C++:字段的类型不完整

转载 作者:行者123 更新时间:2023-11-28 06:09:54 25 4
gpt4 key购买 nike

我正在尝试将策略设计模式作为练习来实现。我的类(class)非常简单:

1) 飞行.cpp

class Fly
{
public:
Fly();
bool fly();
};

class CanFly : public Fly
{
public:
bool fly()
{
return true;
}
};

class CantFly : public Fly
{
public:
bool fly()
{
return false;
}
};

2) 动物.cpp

class Fly;

class Animal
{
Fly myFly;

public:
Animal(Fly f);
void setFly(Fly f);
Fly getFly();
};

Animal::Animal(Fly f)
{
myFly = f;
}

void Animal::setFly(Fly f)
{
myFly = f;
}

Fly Animal::getFly()
{
return myFly;
}

3) 狗.cpp

#include <iostream>
using namespace std;

class Animal;

class Dog : public Animal
{
public:
Dog(Fly f);
};

Dog::Dog(Fly f)
{
setFly(f);
cout << "Dog : " << getFly().fly() << endl;
}

4) 鸟.cpp

#include <iostream>
using namespace std;

class Animal;

class Bird : public Animal
{
public:
Bird(Fly f);
};

Bird::Bird(Fly f)
{
setFly(f);
cout << "Bird : " << getFly().fly() << endl;
}

5) 动物测试.cpp

#include <iostream>
using namespace std;

class Dog;
class Bird;
class CanFly;
class CantFly;

int main()
{
Fly f1 = new CanFly();
Fly f2 = new CantFly();

Bird b(f1);
Dog d(f2);

return 0;
}

我在构建代码时遇到的错误是:

Animal.cpp:5:6: error: field 'myFly' has incomplete type 'Fly'
Fly myFly;
^

谁能帮我看看这是为什么?

谢谢

最佳答案

不完整的类型错误意味着编译器没有看到类的定义,只有声明。如果您创建一个对象或按值传递一个对象,那么您需要向编译器提供该类的定义。您确实创建了对象并通过值传递它们,因此您需要包含传递到 cpp 文件中的相关类的定义。

但这不是您真正想要做的。您的意图是采用多态性,因此您需要通过引用或指针传递对象。

你的 Animal 类应该是:

class Animal
{
Fly &myFly;

public:
Animal(Fly &f);
void setFly(Fly &f);
Fly const &getFly();
};

这样您就可以将任何 Fly、CanFly 或 CantFly 对象传递给 Animal 对象。

您还需要重新组织您的代码。您需要将类定义分离到头文件中。例如:

//Animal.h
class Fly; <=== Declaration. OK here.
class Animal
{
Fly &myFly;

public:
Animal(Fly &f);
void setFly(Fly &f);
Fly const &getFly();
};

然后您需要将 header 包含到 cpp 中。示例:

#include "Animal.h"
class Dog : public Animal <=== Compiler needs definition of Animal here
{
public:
Dog(Fly f);
};

注意以下定义的区别:

Fly Animal::getFly()
{
return myFly;
}

返回存储在 myFly 中的对象的拷贝。

Fly const &Animal::getFly()
{
return myFly;
}

返回对对象 myFly 的常量引用

此外,也许您根本不需要 Fly、CanFly、CantFly 类。 Bird、Dog 类已经“知道”它们是否可以飞行。当然,您正在做运动,但 Fly、CanFly 等在这里似乎是多余的和人为的。

关于C++:字段的类型不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31489876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com