首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 中【没有合适的默认构造函数可用】和【类块放在main后面】的疑惑。该怎么解决

2012-03-27 
C++ 中【没有合适的默认构造函数可用】和【类块放在main后面】的疑惑。C/C++ code#include stdafx.husing nam

C++ 中【没有合适的默认构造函数可用】和【类块放在main后面】的疑惑。

C/C++ code
#include "stdafx.h"using namespace std;/* --- --- --- --- --- --- --- 武器类 --- --- --- --- --- --- */class Weapon{private:    string name;    int power;public:    void Show();    //Weapon(){};    Weapon(string name,int power);};Weapon::Weapon(string name, int power){    this->name = name;    this->power = power;};void Weapon::Show(){    cout<<"武器名:"<<this->name<<"威力值:"<<this->power<<endl;};/* --- --- --- --- --- --- --- 角色类 --- --- --- --- --- --- */class Actor{private:    string name;    bool gender;    Weapon weapon;public:    Actor(string name, bool gender);    void Say();    void Say(string message);    void SetWeapon(Weapon &weapon)    {        this->weapon = weapon;    }};Actor::Actor(string name, bool gender){    this->gender = gender;    this->name = name;}void Actor::Say(){    cout<<"我乃"<<this->name<<"是也..."<<endl;};void Actor::Say(string message){    cout<<this->name<<":"<<message<<endl;};/* --- --- --- --- --- --- --- MAIN --- --- --- --- --- --- */int main(){    Weapon* weapon = new Weapon("九环锡杖",20);    Actor* tang = new Actor("唐三藏", 1);    tang->SetWeapon(*weapon);    tang->Say();    tang->Say("Only you...伴我去西经");    weapon->Show();    cin.get();    return 0;};


Q1:为什么注释掉Weapon的void构造函数会提示error C2512: “Weapon”: 没有合适的默认构造函数可用。

Q2:我把Weapon和Actor两个类放到main后面,并且在main前像“声明函数”(书上叫函数的原型):
class Actor;class Weapon;
编译器却给了我一大堆错误?(VS2008)


[解决办法]
Q1的问题出在你的角色类里私有成员weapon,当你创建Actor对象时,一定会为其所有成员构造。此时的weapon成员必须调用默认构造函数.如果你不声明,肯定会报错的啊
[解决办法]
1、由于你在Weapon中定义了其他构造函数,那么,编译器不会为你创建默认构造函数;然而,你在Actor的构造函数中没有调用Weapon的构造函数,那么,编译器会调用Weapon的默认构造函数,然而,却没有定义,所以,产生了“error C2512: “Weapon”: 没有合适的默认构造函数可用”错误!
[解决办法]
2、如果将类的定义放在使用代码的后面,那么使用代码使用的方式必须是引用、指针,否则,编译器不知道为其分配多少内存。
也就是说,如果使用一个类的对象,该类的定义是必须可见的。
[解决办法]
1.你已经声明了构造函数,则编译器不会再为你默认合成构造函数了.
所以注释掉Weapon的void构造函数自然不可以.


[解决办法]
Q2:我把Weapon和Actor两个类放到main后面,并且在main前像“声明函数”(书上叫函数的原型): 
class Actor;class Weapon; 

把你所谓的声明.,贴出来看下.
[解决办法]
我不知道你理解的类的声明是什么样的,但是像下面这样写,肯定是可以的.
class Weapon
{
private:
string name;
int power;
public:
void Show();
Weapon(){};
Weapon(string name,int power);
};

这样一整块都是声明来的(如果你写过头文件,肯定知道)
C/C++ code
/* --- --- --- --- --- --- --- 武器类 --- --- --- --- --- --- */class Weapon{private:    string name;    int power;public:    void Show();    Weapon(){};    Weapon(string name,int power);};/* --- --- --- --- --- --- --- 角色类 --- --- --- --- --- --- */class Actor{private:    string name;    bool gender;    Weapon weapon;public:    Actor(string name, bool gender);    void Say();    void Say(string message);    void SetWeapon(Weapon &weapon)    {        this->weapon = weapon;    }};/* --- --- --- --- --- --- --- MAIN --- --- --- --- --- --- */int main(){    Weapon* weapon = new Weapon("九环锡杖",20);    Actor* tang = new Actor("唐三藏", 1);    tang->SetWeapon(*weapon);    tang->Say();    tang->Say("Only you...伴我去西经");    weapon->Show();    cin.get();    return 0;};Weapon::Weapon(string name, int power){    this->name = name;    this->power = power;};void Weapon::Show(){    cout<<"武器名:"<<this->name<<"威力值:"<<this->power<<endl;};Actor::Actor(string name, bool gender){    this->gender = gender;    this->name = name;}void Actor::Say(){    cout<<"我乃"<<this->name<<"是也..."<<endl;};void Actor::Say(string message){    cout<<this->name<<":"<<message<<endl;}; 


[解决办法]
2楼都说了。或者你什么也不定义,全用set
[解决办法]
mark,学习了
[解决办法]

探讨
C/C++ codeclass Weapon;
class Actor;
int main()
{
//and so on....
}

class Weapon
{
//and so on....
}

class Actor
{
//and so on....
}



这样是错的。正确声明应该是??

热点排行