为什么我得到这个意外的行为构造类对象

Whiyam I getting this unexpected behaviour constructing class objects?

本文关键字:对象 意外 为什么      更新时间:2023-10-16

我创建了一个名为result_line的类,并且它的构造函数一直存在问题。也就是说它没有被赋期望值。此后,我创建了一个类似的,但更节省的类,名为rsltline,这似乎可以工作。

这是两个类:-

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; }

我有以下代码来创建并显示使用两个类的实例(最后一个使用rsltline类,而不是result_line类,如前两个使用的):

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;

前两个返回Unexpected Results,最后一个使用rsltline类工作正常。结果是:-

HWND=0 FLAGS=0 extraflag =0

HWND=0 FLAGS=1997196755 extrafags =0

HWND=0x2 FLAGS=4 extraflag =6

进程返回0 (0x0)执行时间:35.007 s按任意键继续。

我能想到的唯一可能导致这种情况的是前者的命名。虽然,也许这只是我需要去看验光师的一个例子:)。

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

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可以是相同的名称,但它们将继续表示它们的名称—成员参数