如何定义创建前一个对象的默认构造函数

时间:2015-06-24 15:36:45

标签: c++ constructor

例如,如果我定义一个点对象(2,3)然后使用默认构造函数来声明另一个将导致点对象(2,3)的点。然后,如果我要创建另一个点对象(5,6),默认构造函数将更改为生成点对象(5,6)。这是我的尝试:

point.h

#ifndef POINT_H
#define POINT_H

int point::previousX = 0;
int point::previousY = 0;

int defualtX = previousX;
int defualtY = previousY;

struct point{
    point(int newX = defualtX, int newY = defualtY) 
    : x(previousX = newX), y(previousY = newY){;};
    ~point(void){;};
    static int previousX;
    static int previousY;
    int x, y; 
};

#endif//POINT_H

此代码中存在明显问题。在“先前”和“defualt”变量之前尚未定义类别点;因此,previousX和previousY的定义不起作用。我可以在类定义下面移动“defualt”和“previous”变量,但是点构造函数将不起作用。

4 个答案:

答案 0 :(得分:2)

  

在"之前"之前尚未定义类点。和"默认"变量;因此,previousXpreviousY的定义不起作用

无论如何它都不会起作用,因为你将定义放在头文件中。这是不正确的:必须将定义放在cpp文件中,以避免在链接期间出现双重定义的错误。

将定义移动到cpp文件将修复第一个编译问题,但第二个问题仍然存在:您不能以代码中显示的方式使用defaultXdefaultY变量作为默认参数值,因为即使您可以将previousXpreviousY复制到defaultXdefaultY,这也是一次性复制;所有对point构造函数的调用都将使用零值,并在初始化时复制到defaultXdefaultY

你可以通过添加两个构造函数来解决这个问题 - 没有参数,只有一个参数,如下所示:

point() : x(previousX), y(previousY) {}
point(int x) : x(x), y(previousY) {}

Demo.

注意:我强烈建议不要使用依赖static变量值进行初始化的解决方案,因为它依赖于构造函数执行的顺序,并且在并发系统。

答案 1 :(得分:0)

为什么不将之前的值传递给构造函数?

#ifndef POINT_H
#define POINT_H

class Point
{
public:
Point(int newX, int newY)
{
  x = newX;
  y = newY;
}
int getX() {return x;}
int getY() {return y;}
~Point(){};
private:
int x, y; 
};

#endif//POINT_H

Point oldP(3,3)Point newP(old.getX(),old.getY())

之类的内容

答案 2 :(得分:0)

您可以将默认初始化推迟到这样的独立函数中:

namespace _detail {
  int getDefaultX();
  int getDefaultY();
}

struct point{
    static int previousX;
    static int previousY;

    point(int newX = _detail::getDefaultX(),
          int newY = _detail::getDefaultY());
    ~point();
    int x, y;
};

// in the .cpp file:


point::point(int newX, int newY)
  : x(previousX = newX), y(previousY = newY){;}
point::~point() {}

namespace _detail {
  int getDefaultX() {
    return point::previousX;
  }
  int getDefaultY() {
    return point::previousY;
  }
}
int point::previousX = 0;
int point::previousY = 0;

答案 3 :(得分:0)

按正确顺序声明:

struct point{
    point(int newX = previousX, int newY = previousY) 
    : x(previousX = newX), y(previousY = newY){}

    void print() const { std::cout << x << ", " << y << std::endl; }

    static int previousX;
    static int previousY;
    int x, y; 
};

Live Demo