C++ 在构造类对象时,我是如何得到这种意外行为的?
我创建了一个名为result\u line的类,它的构造函数一直存在问题。也就是说,它没有被指定预期的值。 此后,我创建了一个类似但更为节俭的类,名为rsltline,这似乎奏效了 以下是两个课程:- 结果线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
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,谢谢。你的回答肯定会给我一个解决方案。基本上我想我把语言和它们的细微差别搞混了。谢谢,现在一切都好了。就是这样(我无意保留这些值,这是我试图确定问题的许多实验的一部分)。事实上,除了第一类之外,所有的代码都来自于尝试找出我错在哪里的实验。我应该更仔细地思考一下为什么我在后者中使用了不同的名称。