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