冥玫怪盗 发表于 2008-7-11 20:07

指针传参的问题,请看代码

// Danjicheng.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "string.h"

/*首先定义一个动物类作为基类*/
class Dongwu
{
protected:
        char* Name;
        char* Aihao;
public:
        Dongwu();
        void SetName(char* name);
        void SetAihao(char* aihao);
        void xianshi();
};
Dongwu::Dongwu()
{
        Name = new char[20];
        Aihao = new char[20];
}
void Dongwu::SetName(char* name)
{
        strcpy(Name,name);
}
void Dongwu::SetAihao(char* aihao)
{
        strcpy(Aihao,aihao);
}
void Dongwu::xianshi()
{
        cout<<"基类显示:"<<'\t';
        cout<<"动物类中,一个名为:"<<Name<<"的未知的动物,爱好:"<<Aihao<<'\n';
}

/*创建一个继承与动物类的 狗类 Dog类*/
class Dog:public Dongwu
{
protected:
        int* Age;
public:
        Dog();
        void DogAge(int* age);
        void Dogxianshi();
        ~Dog();
};
void Dog::Dogxianshi()
{
        cout<<"Dog中显示"<<'\t';
        cout<<"狗类中,一个名为:"<<Name<<"的狗,平时喜欢:"<<Aihao<<"今年:"<<Age<<"岁了"<<'\n';
}
void Dog::DogAge(int* age)
{
        Age = age;
}
Dog::Dog()
{
        Age = new int[1];
        Name = new char[20];
        Aihao = new char[20];
}
Dog::~Dog()
{
       
}

int main(int argc, char* argv[])
{
        Dog dog;
        dog.SetName("皮皮");
        dog.SetAihao("咬人");
        dog.DogAge(20);//此处有错误,肯定是传参的时候出现了问题,求教帮助!!!!!!!!!!!!!!
        dog.xianshi();
        dog.Dogxianshi();
}


提示错误如下:
--------------------Configuration: Danjicheng - Win32 Debug--------------------
Compiling...
Danjicheng.cpp
D:\.net程序\Danjicheng\Danjicheng.cpp(75) : error C2664: 'DogAge' : cannot convert parameter 1 from 'const int' to 'int *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
D:\.net程序\Danjicheng\Danjicheng.cpp(78) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.

Danjicheng.exe - 1 error(s), 1 warning(s)

冥玫怪盗 发表于 2008-7-11 20:09

谢谢各位前辈了,我刚学习C++,是自学的,之前没什么基础,所以今天问题比较多,希望各位前辈可以指教,麻烦各位了,认真看看,帮帮我!我真的很喜欢学习编程,希望各位看在我很上心的份上不吝赐教!!!

水中无月 发表于 2008-7-11 20:26

dog.DogAge(20);// 参数必须是一个指针,你应该这样写:
dog.DogAge((int*)20);

int aa = 20;
dog.DogAge(&aa); // 具体怎么写还要看代码的用处...

修改以上错误后编译就没问题了。其他的还要靠自己呀[em03]

冥玫怪盗 发表于 2008-7-11 20:35

编译的确没问题了,可是获取的是地址。
不过还是谢谢你,毕竟知道了。

冥玫怪盗 发表于 2008-7-11 20:37

晓得解决方案了,多谢前辈指点,在 cout<<"狗类中,一个名为:"<<Name<<"的狗,平时喜欢:"<<Aihao<<"今年:"<<*Age<<"岁了"<<'\n';加个 * 就没问题了,感激不尽!

水中无月 发表于 2008-7-11 20:50

呵呵,我可不是什么高手啊,只是喜欢编程罢了[em01]

晨曦的朝阳 发表于 2008-7-11 21:46

dog.DogAge(20);// 参数必须是一个指针,你应该这样写:
dog.DogAge((int*)20);
三楼这种做法我用DEV_CPP虽然可以运行,但是却是出错的,
用你下面那种好
int aa = 20;
dog.DogAge(&aa); // 具体怎么写还要看代码的用处...

中学者 发表于 2008-7-11 22:17

错误原因是内存的非法访问....无月怎么这样弄 - -

mqh21364 发表于 2008-7-11 23:30

[code]
class Dog:public Dongwu
{
protected:
    int Age;
public:
    Dog();
    void DogAge(int age);
    void Dogxianshi();
    ~Dog();
};

void Dog::DogAge(int age)
{
    Age = age;
}
Dog::Dog()
{
    //Age = new int[1];    不要,没用。
    Name = new char[20];
    Aihao = new char[20];
}
[/code]

还有,最后请在析构函数中加上delete [].

mqh21364 发表于 2008-7-11 23:31

8#

内存的非法访问指的是 Age = age 吗?

linren 发表于 2008-7-11 23:33

#include "iostream.h"
#include "string.h"

/*首先定义一个动物类作为基类*/
class Dongwu
{
protected:
        char* Name;
        char* Aihao;
public:
        Dongwu();
        ~Dongwu();
        void SetName(char* name);
        void SetAihao(char* aihao);
        void xianshi();
};

Dongwu::Dongwu()
{
        Name=new char[20];
        Aihao=new char[20];
}

Dongwu::~Dongwu() [color=SeaGreen]//注意要回收动态创建的空间[/color]
{
        delete [] Name;
        delete [] Aihao;
}

void Dongwu::SetName(char* name)
{
        strcpy(Name,name);
}

void Dongwu::SetAihao(char* aihao)
{
        strcpy(Aihao,aihao);
}

void Dongwu::xianshi()
{
        cout<<"基类显示:"<<'\t';
        cout<<"动物类中,一个名为:"<<Name<<"的未知的动物,爱好:"<<Aihao<<'\n';
}

/*创建一个继承与动物类的 狗类 Dog类*/
class Dog:public Dongwu
{
protected:
        int* Age;
public:
        Dog();
        ~Dog();
        void DogAge(int* age);
        void Dogxianshi();
};

Dog::Dog()
{
        Age=new int; [color=SeaGreen]//这里是这样子[/color]
        Name=new char[20];
        Aihao=new char[20];
}

Dog::~Dog() [color=SeaGreen]//注意要回收动态创建的空间[/color]
{
        delete Age;
}

void Dog::DogAge(int* age)
{
        *Age=*age; [color=SeaGreen]//这里是这样子[/color]
}

void Dog::Dogxianshi()
{
        cout<<"Dog中显示"<<'\t';
        cout<<"狗类中,一个名为:"<<Name<<"的狗,平时喜欢:"<<Aihao<<"今年:"<<*Age<<"岁了"<<'\n';  [color=SeaGreen]//这里是这样子[/color]
}

int main(int argc, char* argv[])
{
        Dog dog;
        dog.SetName("皮皮");
        dog.SetAihao("咬人");
        int a=20; [color=SeaGreen]//这里是这样子[/color]
        dog.DogAge(&a); [color=SeaGreen]//这里是这样子[/color]
        dog.xianshi();
        dog.Dogxianshi();
       
        return 0;
}

[bo]PS:[/bo]
皮皮真的是很长寿啊……

冥玫怪盗 发表于 2008-7-12 16:20

多谢各位前辈不吝赐教,我受益匪浅!以后请多多关照小弟!

水中无月 发表于 2008-7-12 17:08

那个,我只是帮助解决编译的问题。至少象我那样写编译就没问题了吧[em01]
我不是说的吗,具体怎么写还要看代码的用途。我曾经就遇到象我上面那种方法写的代码

中学者 发表于 2008-7-12 17:38

回复 10# mqh21364 的帖子

不是,我是说无月的强制转换... 你的这是类型不匹配 - -

我是杨过 发表于 2008-7-12 21:10

帅哥,因为你传递的是一个常量(const型),而函数中赋值的Age是一个int * 类型,所以不允许!

页: [1]

编程论坛