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是参数; XY 可能是 相同的 名称,但它们将继续代表它们的本来面目 — 成员参数.

让我们仔细看看 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;
}

您声明了一组参数,名称为 rwndresult_flagsresult_extraflags。这些是构造函数体内的局部变量,因此隐藏了同名的成员变量。

发生的情况是您将值赋给局部变量(参数),而不是成员变量。

有三种解决方案:要么对参数使用不同的名称,要么为成员变量添加前缀this->,或者使用构造函数初始化列表:

result_line::result_line(HWND rwnd, int result_flags, int result_extraflags)
    : rwnd{rwnd}, result_flags{30], result_extraflags{40}
{
    // Empty body
}