我正在学习C++的OOP,正在写最基本的类。我在为类声明对象时遇到问题。我收到标题中发布的错误。我知道我的类可以工作,因为我将类放在“main.cpp”中,并且我可以毫无问题地声明一个对象。为什么会发生这种情况?我该如何解决它?
我的代码
食物.h
#ifndef PORJECT2_FOOD_H
#define PORJECT2_FOOD_H
const char* RecommendFood(char firstLetter);
class Foods;
#endif //PORJECT2_FOOD_H
食物.cpp
#include "Food.h"
#include <String>
using namespace std;
class Foods{
public:
string name;
int qty;
const string &getName() const {
return name;
}
void setName(const string &name) {
Foods::name = name;
}
int getQty() const {
return qty;
}
void setQty(int qty) {
Foods::qty = qty;
}
};
主.cpp
Foods obj;
string food1 = "Fruit", food2 = "Veggies", Food1, Food2;
int qty1 = 15, qty2 = 165, QTY1, QTY2;
obj.setName(food1);
obj.setQty(qty1);
Food1 = obj.getName();
QTY1 = obj.getQty();
cout << "Food: " << Food1 << " Qty: " << QTY1 << "\n";
obj.setName(food2);
obj.setQty(qty2);
Food2 = obj.getName();
QTY2 = obj.getQty();
cout << "Food: " << Food2 << " Qty: " << QTY2 << "\n";
return 0;
}
您的
Food.h
只告诉用户 class Foods
存在,但不提供有关它的任何信息,因此除了一些小事情外,它不能用于几乎任何事情。这称为前向声明。
现在,你的类在
Food.cpp
中的编写方式已经将所有函数都写在类声明中了——所以你可以将整个内容复制到 Food.h
文件中并完全抛弃 Food.cpp
。
另一种方法是使
Food.h
中的类声明仅包含函数声明,如
const std::string &getName() const;
并将实际实现移至
Food.cpp
文件,如下所示:
const std::string & Foods::getName() const
{
return name;
}
但是,考虑到函数的简单性,将它们放在标头中会更好,因为优化器将完全丢弃该
getName
函数并让调用者直接访问 name
成员变量。如果该函数不在标头中,则无法进行此类优化。
此外,像
Foods::name
这样的事情是行不通的。您可以将其设为 this->name
,或者只是为 name
参数指定一个稍微不同的名称,例如 name_
,这样它就不会隐藏成员变量。