注册 登录
编程论坛 C++教室

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

冥玫怪盗 发布于 2008-07-11 20:07, 1488 次点击
// 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)
14 回复
#2
冥玫怪盗2008-07-11 20:09
谢谢各位前辈了,我刚学习C++,是自学的,之前没什么基础,所以今天问题比较多,希望各位前辈可以指教,麻烦各位了,认真看看,帮帮我!我真的很喜欢学习编程,希望各位看在我很上心的份上不吝赐教!!!
#3
水中无月2008-07-11 20:26
dog.DogAge(20);// 参数必须是一个指针,你应该这样写:
dog.DogAge((int*)20);

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

修改以上错误后编译就没问题了。其他的还要靠自己呀
#4
冥玫怪盗2008-07-11 20:35
编译的确没问题了,可是获取的是地址。
不过还是谢谢你,毕竟知道了。
#5
冥玫怪盗2008-07-11 20:37
晓得解决方案了,多谢前辈指点,在 cout<<"狗类中,一个名为:"<<Name<<"的狗,平时喜欢:"<<Aihao<<"今年:"<<*Age<<"岁了"<<'\n';加个 * 就没问题了,感激不尽!
#6
水中无月2008-07-11 20:50
呵呵,我可不是什么高手啊,只是喜欢编程罢了
#7
晨曦的朝阳2008-07-11 21:46
dog.DogAge(20);// 参数必须是一个指针,你应该这样写:
dog.DogAge((int*)20);
三楼这种做法我用DEV_CPP虽然可以运行,但是却是出错的,
用你下面那种好
int aa = 20;
dog.DogAge(&aa); // 具体怎么写还要看代码的用处...
#8
中学者2008-07-11 22:17
错误原因是内存的非法访问....无月怎么这样弄 - -
#9
mqh213642008-07-11 23:30
程序代码:

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];
}


还有,最后请在析构函数中加上delete [].
#10
mqh213642008-07-11 23:31
8#

内存的非法访问指的是 Age = age 吗?
#11
linren2008-07-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() //注意要回收动态创建的空间
{
    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; //这里是这样子
    Name=new char[20];
    Aihao=new char[20];
}

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

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

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

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

[bo]PS:[/bo]
皮皮真的是很长寿啊……
#12
冥玫怪盗2008-07-12 16:20
多谢各位前辈不吝赐教,我受益匪浅!以后请多多关照小弟!
#13
水中无月2008-07-12 17:08
那个,我只是帮助解决编译的问题。至少象我那样写编译就没问题了吧
我不是说的吗,具体怎么写还要看代码的用途。我曾经就遇到象我上面那种方法写的代码
#14
中学者2008-07-12 17:38
回复 10# mqh21364 的帖子
不是,我是说无月的强制转换... 你的这是类型不匹配 - -
#15
我是杨过2008-07-12 21:10
帅哥,因为你传递的是一个常量(const型),而函数中赋值的Age是一个int * 类型,所以不允许!
1