C++ 在构造类对象时,我是如何得到这种意外行为的?

C++ 在构造类对象时,我是如何得到这种意外行为的?,c++,class,constructor,instance,C++,Class,Constructor,Instance,我创建了一个名为result\u line的类,它的构造函数一直存在问题。也就是说,它没有被指定预期的值。 此后,我创建了一个类似但更为节俭的类,名为rsltline,这似乎奏效了 以下是两个课程:- 结果线 class result_line { private: HWND rwnd; int result_flags; int result_extraflags; public: result_line(HWND, int, int); ~result

我创建了一个名为result\u line的类,它的构造函数一直存在问题。也就是说,它没有被指定预期的值。 此后,我创建了一个类似但更为节俭的类,名为rsltline,这似乎奏效了

以下是两个课程:-

结果线

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

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;
}
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\u line类):-

result\u line foo=结果线(0,3,6);

std::cout在
result\u line
的构造函数体中,您编写了以下内容:

 rwnd = rwnd;
这是参数的自赋值。该成员保持未初始化状态(与其他两个成员一样)。你想写这个:

this->rwnd = rwnd;
这是我在您的代码中看到的一个问题,可以如上所述进行修复-但是,最好使用成员初始化列表:

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

让我们更仔细地看看
结果行
构造函数:

// 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\u flags
result\u extraflags
。这些都是构造函数函数体中相同的局部变量,因此会对具有相同名称的成员变量进行阴影处理

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

有三种解决方案:或者为参数使用不同的名称,或者在成员变量前面加上
this->
,或者使用构造函数初始值设定项列表:


请构造一个。解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括再现您的问题的示例,以及您在调试器中所做的观察。构造函数参数和实例变量具有完全相同的名称会招致灾难。我个人认为rwnd=rwnd是实例变量的自赋值:-),但我不在乎谁对谁错,因为您想将参数赋值给实例变量,它肯定不会这样做。@gnasher729:“我个人认为rwnd=rwnd是实例变量:-)的自赋值。”。。。。不,存在同名的参数,因此它是该参数的自赋值。同样,同名参数隐藏了成员。@Nawaz,谢谢。你的回答肯定会给我一个解决方案。基本上我想我把语言和它们的细微差别搞混了。谢谢,现在一切都好了。就是这样(我无意保留这些值,这是我试图确定问题的许多实验的一部分)。事实上,除了第一类之外,所有的代码都来自于尝试找出我错在哪里的实验。我应该更仔细地思考一下为什么我在后者中使用了不同的名称。