0

これはこのウェブサイトでの私の最初の質問ですが、必要なすべてをカバーしようとします. 何か忘れていたらすみません。QT Creator を使用して問題が発生しましたが、Visual Studio または C++ を使用しても同じであると思います。

Mainwindow、Track、AddForm という 2 つのクラスがあります。メインウィンドウはそれが呼ばれるものです。メインフォーム。Track は、単一の QString 変数を含む QObject に基づくカスタム クラスです (今のところ、私はまだ QT を試しているためです)。AddForm は、MainWindow フォームのボタンをクリックして作成できる別のフォームのクラスです。そのフォームには、文字列を埋めるための単一の行編集と、「追加」というボタンのみが含まれています。そのボタンが押されるたびに、行編集のテキストが Track クラスの QString 変数に入れられます。その QString 変数は「アーティスト」と呼ばれます。

行編集からのテキストを Track オブジェクトの変数「artist」に割り当てることとは別に、フォームはそのオブジェクト全体を送信するシグナルも発行します。メインウィンドウ内のスロットがその信号に反応し、トラック オブジェクトを収集します。ここまでは順調ですね。

これが私の質問です。mainwindow-header 内で、trackVector という名前のプライベート QVector を作成しました。これを mainwindow.cpp 内で呼び出すことができます。私がやりたいことは、その Track オブジェクトで QVector を追加/プッシュバックすることです。このような並べ替え:

trackVector.push_back(trackObject);

アプリケーションのビルド時に次のエラー メッセージが表示されます: スクリーンショットを表示するには、ここをクリックしてください

もちろん、整数またはその他の変数を使用すると、これは非常に簡単です。あなたは私が推測するこのようなことをするだけです:

QVector<int> myVector;
myVector.push_back(3);

QVector (または標準の QT 以外のベクトル) を追加するときはいつでも、そのクラスのコンストラクターを使用して追加する必要があると思います。しかし、既存のオブジェクトを配置できるコンストラクターを作成するにはどうすればよいでしょうか?

私は英語のネイティブスピーカーではないので、できるだけ簡単な言葉で説明してください:) よろしくお願いします!

4

1 に答える 1

1

あなたは不十分なコードを投稿しました (そのため、あなたの投稿はトピック外として閉じられる可能性があります-SO の古典的な初心者のエラーです)、ここでの適切な解決策は、自動ポインター型を使用することだと思います. TrackVectorオブジェクトの所有権を保持する場合Track、最良の解決策はstd::unique_ptr<Track>要素を持つことです。

std::vector<std::unique_ptr<Track>> TrackVector;
// filled like
TrackVector.emplace_back(new Track(args));

一方、所有権が別の場所にある場合は、生のポインターを使用するstd::shared_ptrか、生のポインターを使用することもできます (レイアウトが、オブジェクトを指すTrackオブジェクトの寿命が の寿命を超えることを保証する場合TrackVector)。

于 2016-05-31T17:32:22.767 に答える