0

私が気づいた奇妙な動作を示す簡単なスニペットを作成しました。それでおしまい:

#include <QCoreApplication>
#include <QLineEdit>

class MyObject : public QWidget
{
public:
    explicit MyObject(QWidget *parent = 0) : QWidget(parent) {
        editor = new QLineEdit(this);
    }

    void setValue(const QString &s) const {
        editor->setText(s);
        editor->setReadOnly(true);
        editor->setMaxLength(s.length());
    }

private:
    QLineEdit *editor;
};

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    return app.exec();
}

MyObject::setValuefunction にはconst指定子がありますが、このコードはうまくコンパイルされています。setTextsetReadOnlyおよびsetMaxLength関数は ではないことに注意してくださいconst

void setText(const QString &);
void setReadOnly(bool);
void setMaxLength(int);

そのような行動の原因を知りたいだけですか?MingGW 4.6.2 で Qt 4.7.4 を使用しています。

4

2 に答える 2

5

(これは Qt 関連ではありません。これは一般的な C++ の質問です。)

を変更していないため、コンパイラは正しいですeditor。変更しているのは*editor; それが指しているオブジェクトを変更しているだけです。指定子は、オブジェクトに直接含まれるメンバーのconst変更のみを許可しません。指しているオブジェクトeditorはメンバーではないため、変更できます。

void setValue(const QString &s) const {
    editor->setText(s); // OK
    editor = new QLineEdit; // Error: 'editor' is changed.
}
于 2012-10-31T16:07:37.857 に答える
0

ところで、メソッドの constness を確認する方法は 2 つあります。

  • メンバー関数がオブジェクトのデータ メンバー (静的メンバーを除く) を変更しない場合は、ビット単位の constnessまたは物理 constness
  • 論理的な一貫性は、ポイントされたオブジェクトであっても変更を許可しません。

あなたが経験したように、コンパイラは最初のタイプの定数のみを検出します:)

これについては、Scott Meyers によって書かれた「Effective C++」の項目の 1 つで説明されています。

于 2012-10-31T16:20:52.660 に答える