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类型)。是的,如果您愿意,您可以在类中放置定义。