【问题标题】:Whiyam I getting this unexpected behaviour constructing class objects?为什么我在构造类对象时遇到了这种意外行为?
【发布时间】:2016-08-28 11:34:44
【问题描述】:

我创建了一个名为 result_line 的类,但它的构造函数一直存在问题。那就是它没有被分配预期值。 从那以后,我创建了一个类似但更节俭的名为 rsltline 的类,这似乎有效。

这是 2 个类:-

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 EXTRAFLAGS=0

HWND=0 FLAGS=1997196755 EXTRAFLAGS=0

HWND=0x2 FLAGS=4 EXTRAFLAGS=6

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

我认为可能导致这种情况的唯一原因是前者的命名。不过,也许这只是我需要去看眼镜商的一个例子:)。

【问题讨论】:

标签: c++ class constructor instance


【解决方案1】:

让我们仔细看看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-&gt;,或者使用构造函数初始化列表

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

【讨论】:

  • 谢谢,现在一切都修好了。就是这样(我无意保留这些值,这是我试图确定问题的许多实验的一部分)。事实上,除了第一堂课,所有的代码都来自于试图找出我哪里出错的实验。我应该更仔细地了解为什么我在后者中使用了不同的名称。
【解决方案2】:

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

【讨论】:

  • 我个人认为 rwnd = rwnd 是实例变量的自赋值 :-) 但是我不在乎这里谁对谁错,因为你想将参数分配给实例变量,它绝对不会那样做。
  • @gnasher729:“我个人认为rwnd = rwnd是实例变量的自赋值:-)”....不,有一个参数与同名,所以是参数的自赋值。另外,同名参数隐藏了成员。
  • @Nawaz,谢谢。你的回答肯定会给我一个解决方案。基本上我想我把语言和它们的细微差别搞混了。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2020-04-15
  • 2019-08-18
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多