实现中的构造函数与标题

时间:2011-11-11 22:16:24

标签: c++ header implementation

据我所知,构造函数应该在实现文件中定义,但我只能在一个主文件中找到该类的示例,而不是拆分为.h和.cpp文件

我需要知道的是,以下代码是否以可接受的方式分开..

Entity.h:

    using namespace std;

class cEntity {
private:
    /*-----------------------------
    ----------Init Methods---------
    -----------------------------*/
    int *X, *Y;
    int *Height, *Width;

public:
    /*-----------------------------
    ----------Constructor----------
    -----------------------------*/
    cEntity (int,int, int, int);

    /*-----------------------------
    ----------Destructor-----------
    -----------------------------*/
    ~cEntity ();

    /*-----------------------------
    ----------Set Methods----------
    -----------------------------*/

    /*Set X,Y Methods*/
    void setX(int x){*X=x;};
    void setY(int y){*Y=y;};
    void setXY(int x, int y){*X=x; *Y=y;};

    /*Set Height, Width Methods*/
    void setHeight(int x){*Height=x;};
    void setWidth(int x){*Width=x;};
    void setDimensions(int x, int y){*Height=x; *Width=y;};

    /*-----------------------------
    ----------Get Methods----------
    -----------------------------*/

    /*Get X,Y Methods*/
    int getX(){return *X;};
    int getY(){return *Y;};

    /*Get Height, Width Methods*/
    int getHeight(){return *Height;};
    int getWidth(){return *Width;};
};

和Entity.cpp:

#include "Entity.h"


cEntity::cEntity (int x, int y, int height, int width) {
   X,Y,Height,Width = new int;
  *X = x;
  *Y = y;
  *Height = height;
  *Width = width;
}

cEntity::~cEntity () {
  delete X, Y, Height, Width;
}

我还要感谢大家的帮助,尤其是我的第一个问题!

5 个答案:

答案 0 :(得分:3)

是的,没关系。 但是,构造函数和析构函数存在问题。 你的代码实际上做的是分配一个int,你的析构函数也释放一个int。 无论如何,这里不需要使用指针。 更好的实现(如果我们不使用智能指针)可能是:

[Entity.h]

private:
    /*Private fields*/
    int X, Y;
    int Height, Width;

[Entity.cpp]

cEntity::cEntity (int x, int y, int height, int width) {
  X = x;
  Y = y;
  Height = height;
  Width = width;
}
cEntity::~cEntity () {
}

还有一件事。尽量避免头文件中的using namespace std;。如果这样做,你强制那些包含你的标题的人使用这个using语句,它会引发命名空间冲突。

答案 1 :(得分:3)

cEntity::cEntity (int x, int y, int height, int width) {

是正确的

   X,Y,Height,Width = new int;
不是那么多。这会将Width设置为新的int,但不会设置为其他 X = new int(x); Y = new int(y); Height = new int(height); Width = new int(width); 。你可能打算:

cEntity::cEntity (int x, int y, int height, int width) {
    :X(new int(x))
    ,Y(new int(y))
    ,Height(new int(height))
    ,Width(new int(width))
{}

请注意,这种构造方法不适用于没有赋值/复制的对象,如引用。对于某些对象,它也比在适当的位置构建它们慢。因此,构建的首选方式如下:

std::unique_ptr<int>

这样更好,但如果抛出任何异常,您将不得不以某种方式释放已分配的异常。更好的方法是让每个成员都成为{{1}},这样他们就可以解除分配并避免许多麻烦。

答案 2 :(得分:1)

你的分离很好。这些函数的实现是错误的,但你已经适当地将它们与声明分开了。 (他们不会像你想象的那样分配或释放任意数量的对象。)

答案 3 :(得分:0)

是。至少对于分离来说,这通常是最好的方法。

至于实际实施,你有一些问题。我不确定你要用构造函数做什么,或者如果你有类成员变量的正确数据类型但似乎有些东西。

答案 4 :(得分:-1)

直接在类中定义的任何方法都是隐式内联的,包括构造函数。

即。

class MyClass  
{  
public:    
    MyClass() {};  
};

定义了一个内联构造函数,它可能(或可能不)提高代码性能,

尽管

class MyClass  
{  
public:  
    MyClass();  
};  

MyClass::MyClass()
{
};

没有内联,因此没有这些好处。这两个选项都是正确的C ++。

只需2美分。

P.S是的,当你决定以这种方式在一个类中存储指针时,你打开一个Pandora框。