入力データとして、外部データへの参照を (コピーせずに) 使用するか、他の入力に基づいてデータ自体を作成するクラスがあります。私は参照を使用することを好み(データは行列であるため、逆参照を避けるため)、最終的に次の構造になりました(簡略化):
#include <iostream>
#include <vector>
using namespace std;
using VectI = vector<int>;
class A {
VectI x0;
VectI const & x = x0;
public:
A(VectI const & extX) : x(extX) {} // referencing existing external data
A(int i) { x0.push_back(i); x0.push_back(i*i); } // create from other data
void show_x()
{ cout << "x ="; for (auto&& i : x) cout << " " << i; cout << endl; }
};
int main() {
VectI myX = {1, 2, 3};
A a(myX); a.show_x(); // a references myX
A b(2); b.show_x(); // b creates its own data based on i=2
return 0;
}
例は動作します:
x = 1 2 3
x = 2 4
しかし、このアプローチに潜在的な問題はありますか? 特に、 const vector 'legal' C++x0
によって参照される変更を行っているという事実 ですか、それとも他のコンパイラが不満を言う可能性がありますか?x
また、最初のコンストラクターがデータのコピーを回避していると確信できますか?