我在使用C ++创建新对象时遇到了麻烦

时间:2011-09-29 02:11:47

标签: c++ visual-c++

我是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()功能是否正常,但显然不是。 你能给我一个建议吗?

干杯

3 个答案:

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

您应该避免使用newdelete,当然,除非确实有必要。 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对象。