为什么我得到这个意外的行为构造类对象
Whiyam I getting this unexpected behaviour constructing class objects?
我创建了一个名为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_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
的构造函数体中,您这样写:
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
可以是相同的名称,但它们将继续表示它们的名称—成员和参数。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 打印对象矢量的意外输出
- 从指针返回对象时出现意外的析构函数调用
- 意外C++队列行为,弹出后丢失对象
- std::min_element 从类对象返回意外结果
- 在同一对象上创建多个shared_ptr“族”时shared_from_this的意外行为
- 防止意外对象不兼容
- 来自异常声明的派生对象类型是否意外
- 对常量临时对象的引用出现意外行为
- 在继承中使用delete的意外行为,基指针对象指向派生程度最高的类
- 如何防止意外调用非常量对象上的变异函数
- C++/JNI-存储对象(jobject)在向量和数组中发生意外更改,C++或JNI问题
- 当从固定结构体中存储的对象构建函数时,c++ lambda构建静态函数返回意外值
- 对象的成员变量发生意外更改
- 为什么我得到这个意外的行为构造类对象
- 提振.Python中的Python c++对象引用:意外行为