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();
}
}
嗨,我尝试学习使用 类 和 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();
}
}