C++ 定义类(和嵌套类)成员函数的更好/更简洁/更可读的方法?
可能重复:C++ 定义类(和嵌套类)成员函数的更好/更简洁/更可读的方法?,c++,class,function,nested,member,C++,Class,Function,Nested,Member,可能重复: 我一直在努力学习C++,并且我对C++面向对象编程有一些理解。我最近花了很多时间在Java上工作,也许这让我很懒,但下面是我遇到的问题 以下是我正在使用的不完全完整的代码: class Pong{ public: Pong(); void run(); private: //Class to represent a pong ball class Ball{ public:
我一直在努力学习C++,并且我对C++面向对象编程有一些理解。我最近花了很多时间在Java上工作,也许这让我很懒,但下面是我遇到的问题 以下是我正在使用的不完全完整的代码:
class Pong{
public:
Pong();
void run();
private:
//Class to represent a pong ball
class Ball{
public:
Ball();
int getVector();
private:
int xvel,yvel;
};
//Class to represent a pong paddle
class Paddle{
public:
private:
};
bool init();
//The ball and player paddles
Ball ball;
Paddle p1;
Paddle p2;
};
//Ball members
Pong::Ball::Ball(){
}
//Paddle members
Pong::Paddle::Paddle(){
}
//Pong members
Pong::Pong() : ball(Ball()),p1(Paddle()),p2(Paddle()){
ball = Ball();
p1 = Paddle();
p2 = Paddle();
}
bool Pong::init(){
if(!log("Starting pong...")){return 2;}
return 0;
}
void Pong::run(){
if(Pong::init() != 0){log("Failed to initialize Pong!");}
return;
}
我这里的问题实际上是关于可读性的。我想知道是否有一种外观不那么难看的方法来定义成员和嵌套成员,而不必指定诸如Pong::Ball::Ball()之类的内容,即将名称空间放在每个成员前面
我做错什么了吗?来自java,所有成员都在类本身内部定义,这看起来真的。。。也许对我来说,定义类定义之外的一切(包括嵌套类方法)都很粗糙。这是可行的,但我忍不住觉得有更好的方法来做,然而我一直在使用的资源(cprogramming.com)说这是需要做的
(编辑:就在有人抓到我之前,我知道我可以删除Pong构造函数中的重复定义。我只是还没有…)
来自java,所有成员都在类本身内部定义,这看起来真的。。。也许对我来说,定义类定义之外的一切(包括嵌套类方法)都很粗糙
这不是问题。C++是如此棒,它允许您定义类定义的强>内和外< /强>的方法。< /P>
如果你想把定义保留在外面,不,没有办法减少限制
我只是指出以下几点,因为我认为你可能弄错了:
Pong::Pong() : ball(Ball()),p1(Paddle()),p2(Paddle()){
ball = Ball();
p1 = Paddle();
p2 = Paddle();
}
应该是
Pong::Pong(){
}
i、 e.不需要任何显式初始化。这些不是名称空间,而是嵌套类。名称空间是用
namespace
关键字打开的,如果定义在名称空间大括号内,则不需要限定。也许吧,但我查看了答案,它们似乎没有提供相同的。。。我正在寻找的信息。嗯,老实说,我一直在遵循在cprogramming.com上的教程中告诉我的内容。在内部和外部定义它们之间没有区别吗?如果所有成员类型都有构造函数,那么两者都是等价的,因此根本不提供构造函数(这涉及较少的编码)。如果任何成员是POD类型,则它们不是等效的。也就是说,宁愿显式初始化:Pong::Pong():ball(),p1(),p2(){}
(如果任何成员是POD),或者避免提供构造函数altogether@DavidRodríguez dribeas是的,在他的例子中,球
不是吊舱类型,桨
是空的。罗杰。所以我可以安全地将所有方法定义放在类{}中;它本身如果一个成员是普通的旧数据类型,那么到底有什么区别呢?我应该确保在相应的初始化列表中指定它?@Arialth如果它是POD成员,默认情况下不会初始化它。例如,我编写的Pong
构造函数不会初始化paile
(在本例中,这很好,因为它是空的),但会初始化Ball
(因为它不是POD类型)。是的,如果您愿意,您可以在类中放置定义。