2015-06-24 58 views
2

例如,如果我定义了一个点对象(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 

有这码一个明显的问题。在“先前”和“不确定”变量之前没有定义类别点;因此,previousX和previousY的定义将不起作用。我可以在类定义下面移动“defualt”和“previous”变量,但是这个point构造函数不起作用。

+0

将'int point :: previousX = 0;'和'int point :: previousY = 0;'移入单独的翻译单元或在类声明中初始化它们。 –

+1

可怕的解决方案,与这种方法找到错误运气好。 – Slava

+0

听起来有点像XY-问题,为什么你想这样做? – WorldSEnder

回答

2

在“previous”和“default”变量之前没有定义类别点;因此,previousXpreviousY定义将无法正常工作

它不会反正工作,因为你放置定义成一个头文件。这是不正确的:定义必须放置在cpp文件中,以避免链接过程中出现双重定义的错误。

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

您可以通过添加两个构造解决这个 - 不带任何参数,并用一个参数,像这样:

​​

Demo.

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

+0

如果不使用静态成员,你建议我做什么? – dylan

+0

@dylan通过一些其他的非静态方法提供对代码中最后一点的访问,这些代码调用没有参数的构造函数。这最初会使你的系统复杂化,但结果会更可读。 – dasblinkenlight

+0

@dylan你可以使用独立功能,不是吗? (请参阅下面的答案),尽管我也推荐反对它 – WorldSEnder

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())

+0

,因为那样你总是必须能够访问'old',这对于许多项目来说当然不成立,尽管OP试图实现的并不一定是可取的 – WorldSEnder

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; 
+0

现在,如果您在创建任何其他点之前使用defualt构造函数,您将得到一个随机点而不是(0,0)。这是正确的吗? – dylan

+0

哦,是的,忘了初始化'point :: previousX'和'point :: previousY',修正了 – WorldSEnder

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

相关问题