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

时间:2016-04-20 13:53:44

标签: c++ undefined-reference stdstring

Hy,我尝试学习在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);
}

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

3 个答案:

答案 0 :(得分:0)

显然你必须描述构造函数必须做的事情。如果你想让他什么都不做,那就放:

plant() {}

但我建议至少:

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

答案 1 :(得分: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将设置多个工厂实例的数组。

现在兼容的plantPrint功能与我们的plantCreate功能:

  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;
        }
    }

最后与我们的功能兼容:

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

就像这样可能有效。但是因为我的c ++有点生锈,可能会有一些错误,但你可以纠正它们。此外,也许你应该重新学习instancation如何工作,类型和变量如何工作等...:)

另外在数组上使用sizeof时要小心,我不认为它会返回数组的长度。

答案 2 :(得分:0)

如果你想使用oo设计,为什么不让你的植物创建和植物打印到植物方法?另外,plantCreate可能只是构造函数的一部分而不是单独的方法。请记住对对象使用指针/引用。试试这个。

#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();
    }
}