变量的“食物”类型不完整 - 为什么?

问题描述 投票:0回答:1

我正在学习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;
}
c++ oop header-files
1个回答
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_
,这样它就不会隐藏成员变量。

© www.soinside.com 2019 - 2024. All rights reserved.