我是C ++的新手,我遇到了麻烦。
我试图创建没有(*)的新对象,所以Animal a1;
但它没有用。
所以现在我正在使用Animal* a1;
,它可以工作,但问题是它说它必须初始化。
我做了一个默认构造函数,所以它不是意味着它自动初始化或者我应该再次初始化它吗?
这些是我的代码:
Animal.cpp
#include "Animal.h"
using namespace std;
Animal::Animal(int newid, double newweight, int yy, int mm, int dd, double newaccDose, char newsex)
{
id = newid;
weight = newweight;
yy = yy;
mm = mm;
dd = dd;
dose = newaccDose;
sex = newsex;
}
Animal::Animal()
{
id = 0;
weight = 0;
yy = 0;
mm = 0;
dd = 0;
dose = 0;
sex = ' ';
}
Animal::~Animal(){}
double Animal::getDaysDifference(){
jdate dateOfBirth(dd,mm,yy);
jdate now;
double diff = now-dateOfBirth;
return diff;
}
void Animal::addAnimal(){
int select=0;
while(select==1 || select==2){
cout << "1. Cattle 2. Sheep" << endl;
cout << "Select a type of animal: ";
cin >> select;
cout << "Invalid number please try again" << endl;
}
}
Animal.h
#ifndef ANI_H
#define ANI_H
#include <vector>
#include "Treatment.h"
#include "jdate.h"
class Animal{
protected:
int id;
double weight;
int yy;
int mm;
int dd;
double dose;
char sex;
//Treatment treatArray[];
public:
Animal();
Animal(int newid, double newweight, int yy, int mm, int dd, double newdose, char newsex);
~Animal();
virtual double calcDose() = 0;
void addAnimal();
void questions(); // ask questions like id,weight, and so on
double getDaysDifference();
};
#endif
DrugAdmin.cpp
//Main function
#include <iostream>
#include "Animal.h"
#include "Cattle.h"
using namespace std;
int main(){
Animal* a1;
a1->addAnimal();
}
我这样做是为了检查addAnimal()
功能是否正常,但显然不是。
你能给我一个建议吗?
干杯
答案 0 :(得分:1)
宣布
时Animal* a1;
a1
没有指向任何内容:它是一个未初始化的变量,具有未定义的值。在其上调用方法具有未定义的行为。如果您有默认构造函数,则可以创建默认构造的本地Animal
,如下所示:
Animal a1;
此Animal
将存在,直到定义范围的末尾。如果您需要一个超出函数末尾的Animal
,您可以使用new
动态分配它,这会为您提供Animal*
(指向Animal
的指针)你必须稍后delete
:
Animal* make_animal() {
return new Animal();
}
int main(int argc, char** argv) {
Animal* a1 = make_animal();
delete a1;
}
您应该避免使用new
和delete
,当然,除非确实有必要。 StackOverflow上有很多好的答案,涵盖类似的地面。搜索它们。
答案 1 :(得分:0)
我想:
while(select==1 || select==2){
addAnimal()
中的应为:
while ((select != 1) && (select !=2)) {
你现在拥有它的方式,它永远不会进入循环,因为select
初始化为0,既不是1也不是2.那是因为它意味着“运行这个循环而值为1或2“。后者意味着“运行此循环,而它既不是1也不是2”。
因此,如果由于一些奇怪的太阳黑子 - 或 - 热核 - 爆炸引起的错误,它 进入该循环,它会留在那里直到你输入无效价值而非有效价值。
您还想检查一行:
cout << "Invalid number please try again" << endl;
因为即使你输入一个有效值,它也会输出那个字符串(最简单的解决方案可能是围绕它包裹if
)。
答案 2 :(得分:0)
当你说Animal * a1它只是为指针分配足够的空间时,你实际上并没有调用默认构造,也没有创建Animal对象。