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,学习了
[解决办法]