例如,如果我定义一个点对象(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”变量,但是点构造函数将不起作用。
答案 0 :(得分:2)
在"之前"之前尚未定义类点。和"默认"变量;因此,
previousX
和previousY
的定义不起作用
无论如何它都不会起作用,因为你将定义放在头文件中。这是不正确的:必须将定义放在cpp文件中,以避免在链接期间出现双重定义的错误。
将定义移动到cpp文件将修复第一个编译问题,但第二个问题仍然存在:您不能以代码中显示的方式使用defaultX
和defaultY
变量作为默认参数值,因为即使您可以将previousX
和previousY
复制到defaultX
和defaultY
,这也是一次性复制;所有对point
构造函数的调用都将使用零值,并在初始化时复制到defaultX
和defaultY
。
你可以通过添加两个构造函数来解决这个问题 - 没有参数,只有一个参数,如下所示:
point() : x(previousX), y(previousY) {}
point(int x) : x(x), y(previousY) {}
注意:我强烈建议不要使用依赖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;
};