Class 和对象错误,未定义的引用,字符串没有命名的成员

Class and object error, undefined reference, string has no member named

嗨,我尝试学习使用 类 和 c++ 中的对象,我编写了以下代码:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class plant

{
    public:
        plant();

    void setWater(int vz)
    {
        water = vz;
    }

    void setFood(int tp)
    {
        food = tp;
    }

    int getWater()
    {
        return water;
    }

    int getFood()
    {
        return food;
    }

private:
int water, food;
};

void plantCreate(string name[])
{
    for(int i=0;i<sizeof(name);++i)
    {
        plant name[i];  // undefined reference to `plant::plant()' 
        name[i].setWater(rand()%20);
        name[i].setFood(rand()%20);
    }
}

void plantPrint(string name[])
{
    for(int i=0;i<sizeof(name);++i)
    {
        cout << name[i] << ": Water= " << name[i].getWater() << ", Food= " << name[i].getFood() << endl;
        //error: ‘std::string’ has no member named ‘getWater’/'getFood'
    }
}

int main()
{
    string plantNames[5]={"Liliom", "Tulipan", "Narcisz", "Rozsa", "Pipacs"};
    plantCreate(plantNames);
    plantPrint(plantNames);
}

如果我从 plantPrint 中注释掉 cout,我会得到这两个错误,首先是字符串成员,然后是未定义的引用,我会得到第二个错误。我厌倦了使用 plant(); 创建默认构造函数,但它只是无法正常工作。有任何想法吗? (我在 Ubuntu 上使用代码块)

很明显,您必须描述构造函数必须执行的操作。如果你想让他什么都不做,只需输入:

plant() {}

但我至少建议:

plant() : water(0), food(0) {}

对于第二个错误//error: ‘std::string’ has no member named ‘getWater’/'getFood'

你试图在一个字符串上调用 getWater 和 getFood,事实上,你的 name 变量是一个字符串数组,我想你想要一个植物数组。

编辑: 正确的 PlantCreate 函数:

plantCreate(plant[] plantlist, string name[], int length)
{
    for(int i=0;i<length;i++)
    {
        planlist[i].setName(name[i]);  
        planlist[i].setWater(rand()%20);
        planlist[i].setFood(rand()%20);
    }
    return results;
}

就像 plantCreate 将设置您的多个植物实例的数组。

现在有一个与我们的 plantCreate 函数兼容的 plantPrint 函数:

  void plantPrint(plant[] plantlist, int length)
    {
        for(int i=0;i<length;++i)
        {
            cout << plantlist[i].getName() << ": Water= " << plantlist[i].getWater() << ", Food= " << plantlist[i].getFood() << endl;
        }
    }

最后是与我们的功能兼容的 main:

int main()
{
    string plantNames[5]={"Liliom", "Tulipan", "Narcisz", "Rozsa", "Pipacs"};
    plant plantList[5];
    plantCreate(plantList, plantNames, 5);
    plantPrint(plantList,5);
}

这样可能会奏效。但是由于我的 c++ 有点生锈,可能会有一些错误,但您将能够更正它们。另外,也许你应该重新学习实例化是如何工作的,类型和变量是如何工作的等等......:)

此外,当你在数组上使用 sizeof 时要小心,我不认为它 returns 数组的长度。

如果你想使用 oo 设计,为什么不将你的 plantCreate 和 plantPrint 设置为 Plant 方法? plantCreate 也可以成为构造函数的一部分,而不是单独的方法。请记住对对象使用 pointer/reference。试试这个。

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class Plant
{
    private:
        string name;
        int water, food;

    public:
        Plant(string name) : name(name)
        {
            plantCreate();
        }

        void setWater(int vz)
        {
            water = vz;
        }

        void setFood(int tp)
        {
            food = tp;
        }

        int getWater()
        {
            return water;
        }

        int getFood()
        {
            return food;
        }


        void plantCreate()
        {
            setWater(rand()%20);
            setFood(rand()%20);
        }
        void plantPrint()
        {
            cout << name << ": Water= " << getWater() << ", Food= " << getFood() << endl;
        }
};

int main()
{
    string plantNames[5]={"Liliom", "Tulipan", "Narcisz", "Rozsa", "Pipacs"};
    Plant ** myPlants;
    myPlants = new Plant * [5];

    for(int i=0; i<5; i++)
    {
        myPlants[i] = new Plant(plantNames[i]);
        myPlants[i]->plantPrint();
    }
}