Whiyam 我在构造 class 个对象时遇到这种意外行为?
Whiyam I getting this unexpected behaviour constructing class objects?
我创建了一个名为 result_line 的 class,但它的构造函数一直存在问题。那就是它没有被分配预期的值。
从那以后,我创建了一个类似但更节俭的 class,名为 rsltline,这似乎有效。
这是 2 classes :-
result_line
class result_line {
private:
HWND rwnd;
int result_flags;
int result_extraflags;
public:
result_line(HWND, int, int);
~result_line();
HWND result_lineGetHWND();
void result_lineSetHWND(HWND);
int result_lineGetFlags();
int result_lineGetExtraFlags();
DINT result_lineGetBothFlags();
void result_lineSetFlags(int);
void result_lineSetExtraFlags(int);
void result_lineSetBothFlags(int,int);
void result_lineSetBothFlags(DINT);
};
// Constructor for result_line(HWND) and result_line(HWND, result_flag)
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags) {
rwnd = rwnd;
result_flags = 30;
result_extraflags = 40;
}
result_line::~result_line() {}
HWND result_line::result_lineGetHWND() { return rwnd; }
int result_line::result_lineGetFlags() { return result_flags; }
int result_line::result_lineGetExtraFlags() { return result_extraflags; }
DINT result_line::result_lineGetBothFlags() { return DINT(result_flags,result_extraflags); }
void result_line::result_lineSetHWND(HWND rwnd) { rwnd = rwnd; }
void result_line::result_lineSetFlags(int result_flags) { result_flags = result_flags; }
void result_line::result_lineSetExtraFlags(int result_extraflags) { result_extraflags = result_extraflags; }
void result_line::result_lineSetBothFlags(int result_flags, int result_extraflags) {
result_flags = result_flags;
result_extraflags = result_extraflags;
}
void result_line::result_lineSetBothFlags(DINT dint) {
result_flags = dint.aint;
result_extraflags = dint.bint;
}
rsltline
class rsltline {
private:
HWND rlHWND;
int rlflag1;
int rlflag2;
public:
rsltline(HWND, int, int);
HWND rsltlineGetHWND();
int rsltlineGetFlag1();
int rsltlineGetFlag2();
};
rsltline::rsltline(HWND hwnd, int rf1, int rf2) {
rlHWND = hwnd;
rlflag1 = rf1;
rlflag2 = rf2;
}
HWND rsltline::rsltlineGetHWND() { return rlHWND; }
int rsltline::rsltlineGetFlag1() { return rlflag1; }
int rsltline::rsltlineGetFlag2() { return rlflag2; }
我有以下代码使用两个 classes 创建并显示实例(最后一个使用 rsltline class 而不是result_line class,如前两个所用):-
result_line foo = result_line(0,3,6);
std::cout << "HWND=" << foo.result_lineGetHWND() <<
"\tFLAGS=" << foo.result_lineGetFlags() <<
"\tEXTRAFLAGS=" << foo.result_lineGetExtraFlags() <<
std::endl;
result_line testrslt = result_line((HWND) 0,100,200);
std::cout << "HWND=" << testrslt.result_lineGetHWND() <<
"\tFLAGS=" << testrslt.result_lineGetFlags() <<
"\tEXTRAFLAGS=" << testrslt.result_lineGetExtraFlags() <<
std::endl;
rsltline myrsltline = rsltline((HWND)2,4,6);
std::cout << "HWND=" << myrsltline.rsltlineGetHWND() <<
"\tFLAGS=" << myrsltline.rsltlineGetFlag1() <<
"\tEXTRAFLAGS=" << myrsltline.rsltlineGetFlag2() <<
std::endl;
前两个return意外结果,最后一个使用rsltlineclass按预期工作。结果是:-
HWND=0 FLAGS=0 EXTRAFLAGS=0
HWND=0 FLAGS=1997196755 EXTRAFLAGS=0
HWND=0x2 FLAGS=4 EXTRAFLAGS=6
Process returned 0 (0x0) execution time : 35.007 s Press any key to
continue.
我认为唯一可能导致此问题的是前者的命名。虽然,也许这只是我需要去看眼镜商的情况:)。
在result_line
的构造函数体中,你这样写:
rwnd = rwnd;
这是参数的自赋值。该成员保持未初始化状态(也像其他两个成员一样)。你想写这个:
this->rwnd = rwnd;
这是我在您的代码中看到的一个问题,可以按上述方式修复 — 但是,最好使用 member-initialization-list:
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags)
: rwnd(rwnd),
result_flags(result_flags),
result_extraflags(result_extraflags)
{
}
这里,成员以X(Y)
的形式初始化——X
是成员,Y
是参数; X
和 Y
可能是 相同的 名称,但它们将继续代表它们的本来面目 — 成员 和 参数.
让我们仔细看看 result_line
构造函数:
// Constructor for result_line(HWND) and result_line(HWND, result_flag)
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags) {
rwnd = rwnd;
result_flags = 30;
result_extraflags = 40;
}
您声明了一组参数,名称为 rwnd
、result_flags
和 result_extraflags
。这些是构造函数体内的局部变量,因此隐藏了同名的成员变量。
发生的情况是您将值赋给局部变量(参数),而不是成员变量。
有三种解决方案:要么对参数使用不同的名称,要么为成员变量添加前缀this->
,或者使用构造函数初始化列表:
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags)
: rwnd{rwnd}, result_flags{30], result_extraflags{40}
{
// Empty body
}
我创建了一个名为 result_line 的 class,但它的构造函数一直存在问题。那就是它没有被分配预期的值。 从那以后,我创建了一个类似但更节俭的 class,名为 rsltline,这似乎有效。
这是 2 classes :-
result_line
class result_line {
private:
HWND rwnd;
int result_flags;
int result_extraflags;
public:
result_line(HWND, int, int);
~result_line();
HWND result_lineGetHWND();
void result_lineSetHWND(HWND);
int result_lineGetFlags();
int result_lineGetExtraFlags();
DINT result_lineGetBothFlags();
void result_lineSetFlags(int);
void result_lineSetExtraFlags(int);
void result_lineSetBothFlags(int,int);
void result_lineSetBothFlags(DINT);
};
// Constructor for result_line(HWND) and result_line(HWND, result_flag)
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags) {
rwnd = rwnd;
result_flags = 30;
result_extraflags = 40;
}
result_line::~result_line() {}
HWND result_line::result_lineGetHWND() { return rwnd; }
int result_line::result_lineGetFlags() { return result_flags; }
int result_line::result_lineGetExtraFlags() { return result_extraflags; }
DINT result_line::result_lineGetBothFlags() { return DINT(result_flags,result_extraflags); }
void result_line::result_lineSetHWND(HWND rwnd) { rwnd = rwnd; }
void result_line::result_lineSetFlags(int result_flags) { result_flags = result_flags; }
void result_line::result_lineSetExtraFlags(int result_extraflags) { result_extraflags = result_extraflags; }
void result_line::result_lineSetBothFlags(int result_flags, int result_extraflags) {
result_flags = result_flags;
result_extraflags = result_extraflags;
}
void result_line::result_lineSetBothFlags(DINT dint) {
result_flags = dint.aint;
result_extraflags = dint.bint;
}
rsltline
class rsltline {
private:
HWND rlHWND;
int rlflag1;
int rlflag2;
public:
rsltline(HWND, int, int);
HWND rsltlineGetHWND();
int rsltlineGetFlag1();
int rsltlineGetFlag2();
};
rsltline::rsltline(HWND hwnd, int rf1, int rf2) {
rlHWND = hwnd;
rlflag1 = rf1;
rlflag2 = rf2;
}
HWND rsltline::rsltlineGetHWND() { return rlHWND; }
int rsltline::rsltlineGetFlag1() { return rlflag1; }
int rsltline::rsltlineGetFlag2() { return rlflag2; }
我有以下代码使用两个 classes 创建并显示实例(最后一个使用 rsltline class 而不是result_line class,如前两个所用):-
result_line foo = result_line(0,3,6);
std::cout << "HWND=" << foo.result_lineGetHWND() <<
"\tFLAGS=" << foo.result_lineGetFlags() <<
"\tEXTRAFLAGS=" << foo.result_lineGetExtraFlags() <<
std::endl;
result_line testrslt = result_line((HWND) 0,100,200);
std::cout << "HWND=" << testrslt.result_lineGetHWND() <<
"\tFLAGS=" << testrslt.result_lineGetFlags() <<
"\tEXTRAFLAGS=" << testrslt.result_lineGetExtraFlags() <<
std::endl;
rsltline myrsltline = rsltline((HWND)2,4,6);
std::cout << "HWND=" << myrsltline.rsltlineGetHWND() <<
"\tFLAGS=" << myrsltline.rsltlineGetFlag1() <<
"\tEXTRAFLAGS=" << myrsltline.rsltlineGetFlag2() <<
std::endl;
前两个return意外结果,最后一个使用rsltlineclass按预期工作。结果是:-
HWND=0 FLAGS=0 EXTRAFLAGS=0
HWND=0 FLAGS=1997196755 EXTRAFLAGS=0
HWND=0x2 FLAGS=4 EXTRAFLAGS=6
Process returned 0 (0x0) execution time : 35.007 s Press any key to continue.
我认为唯一可能导致此问题的是前者的命名。虽然,也许这只是我需要去看眼镜商的情况:)。
在result_line
的构造函数体中,你这样写:
rwnd = rwnd;
这是参数的自赋值。该成员保持未初始化状态(也像其他两个成员一样)。你想写这个:
this->rwnd = rwnd;
这是我在您的代码中看到的一个问题,可以按上述方式修复 — 但是,最好使用 member-initialization-list:
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags)
: rwnd(rwnd),
result_flags(result_flags),
result_extraflags(result_extraflags)
{
}
这里,成员以X(Y)
的形式初始化——X
是成员,Y
是参数; X
和 Y
可能是 相同的 名称,但它们将继续代表它们的本来面目 — 成员 和 参数.
让我们仔细看看 result_line
构造函数:
// Constructor for result_line(HWND) and result_line(HWND, result_flag)
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags) {
rwnd = rwnd;
result_flags = 30;
result_extraflags = 40;
}
您声明了一组参数,名称为 rwnd
、result_flags
和 result_extraflags
。这些是构造函数体内的局部变量,因此隐藏了同名的成员变量。
发生的情况是您将值赋给局部变量(参数),而不是成员变量。
有三种解决方案:要么对参数使用不同的名称,要么为成员变量添加前缀this->
,或者使用构造函数初始化列表:
result_line::result_line(HWND rwnd, int result_flags, int result_extraflags)
: rwnd{rwnd}, result_flags{30], result_extraflags{40}
{
// Empty body
}