std::vector<A*>
に2つ以上の項目を追加すると、追加された項目のメンバの値が変わりますここ
はMinimal, Complete and Verifiable Example
次のとおりです。スタックに割り当てられた要素のポインタをstd :: vectorにプッシュすると、そのメンバの値が変更されます
#include <iostream>
#include <vector>
struct B;
struct C
{
float x;
C(float x)
{
this->x = x;
}
};
struct A : public C
{
bool begin;
bool visible;
B* b;
A(float x, B* parent)
: C(x)
{
begin = false;
visible = false;
b = parent;
}
};
struct B
{
A a1;
A a2;
B(float x1, float x2)
: a1(x1, this), a2(x2, this)
{
a1.visible = true;
}
};
int main()
{
std::vector<B> bs;
std::vector<A*> as;
bs.push_back(B(1, 2));
as.push_back(&bs.back().a1);
as.push_back(&bs.back().a2);
bs.push_back(B(2, 3));
as.push_back(&bs.back().a1);
as.push_back(&bs.back().a2);
for(auto& it : as)
{
std::cout << it->begin << std::endl;
}
std::cin.get();
return EXIT_SUCCESS;
}
上記のコードの別の問題(それはすでにtobi303でコメントで述べました)があります: 構造体A
からポインタB* b
がB
のインスタンスをコピーによるpush_back(B(...))
に無効となるが、 、解決策はを使用することです代わりに
正確なコードとサンプルの出力を不思議な2つのセグメントで入力できますか? 補足として、いくつかのフィールドはinit-listで初期化され、他のフィールドは本体で割り当てられます。 – bipll
これが問題に関係しているのかどうかはわかりませんが、 'Endpoint'が' Segment'へのポインタを保持していることに気がつきましたが、セグメントを 'vector'に置くとコピーが作成され、あなたが押した一時的なものを指している)。 'emplace_back'はその問題を解決するかもしれません。 – user463035818
それ以外はあまりありません。私はちょうどテストしていましたが、すべてのコードを追加することができます(私は短縮する方が良いと思いました)。私はiniatializerのリストを混ぜて本文に初期化すると問題だと教えてもらえますか? – sro5h