10

私はから公的に継承されたクラスを持っていますQWidget:

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget(const MyWidget& other)
      :
    obj1(other.obj1),
    obj2(other.obj2)

private:
    some_class obj1;
    some_class obj2;
};

プロジェクトをビルドすると、コンパイラが不平を言います:

警告:: 基本クラス「class QWidget」は、コピー コンストラクターで明示的に初期化する必要があります。

stackoverflow に関する他の質問からチェックアウトし、回答を得ました。しかし、実際には、次のように初期化を追加したとき:

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget(const MyWidget& other)
      :
    QWidget(other),   //I added the missing initialization of Base class
    obj1(other.obj1),
    obj2(other.obj2)

private:
    some_class obj1;
    some_class obj2;
};

コンパイルエラーが発生しました:

QWidget::QWidget(const QWidget&) は、このコンテキスト内でプライベートです

だから、私が間違っていることを説明してください。

4

2 に答える 2

14

すべての Qt クラスは、QObject から派生するため、コピーできません。

C++ では、ポリモーフィック オブジェクトのコピーなど、特定の値セマンティック操作を禁止するのが一般的です。Qt は、そのドキュメントで QObject のコピーが許可されている場合に発生する問題の例をいくつか示しています。

Qt オブジェクト...

  • 一意の QObject::objectName() を持つ場合があります。Qt オブジェクトをコピーする場合、コピーにどのような名前を付ける必要がありますか?
  • オブジェクト階層内に位置があります。Qt オブジェクトをコピーする場合、コピーはどこに配置する必要がありますか?
  • 他の Qt オブジェクトに接続して、それらに信号を送信したり、それらによって送信された信号を受信したりできます。Qt オブジェクトをコピーする場合、これらの接続をコピーに転送するにはどうすればよいですか?
  • C++ クラスで宣言されていない新しいプロパティを実行時に追加できます。Qt オブジェクトをコピーする場合、コピーにはオリジナルに追加されたプロパティを含める必要がありますか?
于 2013-09-30T11:11:09.670 に答える