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

C++ 类 找错误

linw1225 发布于 2011-05-11 13:09, 610 次点击
#include<iostream>
using namespace std;
class Main
{
    protected:
  char *mainfood;
 public:
  Mian(char *name)
  {
   mainfood=name;
  }
};
class Sub
{
    protected:
  char *subfood;
 public:
  Sub(char *name)
  {
   subfood=name;
  }
};
class Menu:public Main,public Sub
{
    public:
  Menu(char *m,char *s):Main(m),Sub(s)
  { }

  void show();
};
void Menu::show()
{
 cout<<"主食="<<mainfood<<endl;
 cout<<"副食="<<subfood<<endl;
}
int main()
{
 Menu m("bread","steak");
 m.show();
 return 0;
}
请问这个程序哪里错了?
编译里面是划线部分出现错误,谁能解释下?
8 回复
#2
hellovfp2011-05-11 13:43
class Main
{
    protected:
  char *mainfood;
public:
  Mian(char *name) <<--------------打错了吧?
  {
   mainfood=name;
  }
};
#3
hellovfp2011-05-11 13:44
少用多重继承。
#4
tisyang2011-05-11 13:44
错误有2
第一: 基类 Main 的 构造函数名写错了,是 Main 不是 Mian;
第二: Main Sub 和 Menu 的构造函数参数不应该是 char * 而是 const char *
    原因 :你在 main 函数里提供的 Menu 构造参数 是 "bread" "steak" ,这些字面量字符串的类型是 const char * ,并不是 char *
    编译器不会自动去掉 变量的 const 属性。char * 型的实参 可以 用作 以const char *为形参的函数的参数,反之则不行。
#5
tisyang2011-05-11 13:48
还有,你的 Main 类和 Sub 类的设计有问题,最好不要用 char * 来保存字符串作为类成员,因为你保存了的指针所指向的内存很有可能早就已经被释放了,你再访问的话就会发生不可预知的运行时错误。最好用  std:string 来保存字符串。
#6
linw12252011-05-11 16:08
回复 4楼 tisyang
能不能麻烦你在原代码的基础上修改下?
#7
tisyang2011-05-11 16:37
回复 6楼 linw1225
程序代码:
#include <iostream>
#include <string>
using namespace std;
class Main
{
protected:
  string mainfood;
public:
  Main(const string & name)
  {
   mainfood=name;
  }
};
class Sub
{
protected:
  string subfood;
public:
  Sub(const string & name)
  {
   subfood=name;
  }
};
class Menu:public Main,public Sub
{
public:
  Menu(const string & m,const string & s):Main(m),Sub(s)
  { }
  void show();
};
void Menu::show()
{
cout<<"主食="<<mainfood<<endl;
cout<<"副食="<<subfood<<endl;
}
int main()
{
Menu m("bread","steak");
m.show();
return 0;
}
#8
linw12252011-05-11 21:18
回复 7楼 tisyang
好吧,很感谢你。虽然还是不太懂,我自己再看看。
麻烦了。
#9
linw12252011-05-11 22:39
回复 7楼 tisyang
我自己改了下代码,对了,你可以看看。
#include<iostream>
#include<string>
using namespace std;
class Main
{
    protected:
  char *mainfood;
public:
  Main(char *name)
  {
   mainfood=new char[strlen(name)+1];
   strcpy(mainfood,name);

  }
};
class Sub
{
    protected:
        char *subfood;
    public:
  Sub(char *name)
  {
   subfood=new char[strlen(name)+1];
   strcpy(subfood,name);

  }
};
class Menu:public Main,public Sub
{
    public:
  Menu(char *m,char *s):Main(m),Sub(s)
  { }
  void show();
};
void Menu::show()
{
cout<<"主食="<<mainfood<<endl;
cout<<"副食="<<subfood<<endl;
}
int main()
{
Menu m("bread","steak");
m.show();
return 0;
}
1