いくつかの条件が適用される場合にのみオブジェクトを作成したい場合はnullptrを再実行します。これは私がデルファイ(2009+)でそれを行うだろうかです:何らかの条件がある場合のみオブジェクトを作成し、それ以外の場合はnullptrを返します。
function GetGen(n : integer) : Generics.Collections.TList<Integer>;
var
i : integer;
begin
result := nil;
if n > 0 then begin
result := Generics.Collections.TList<Integer>.Create;
for i := 0 to n - 1 do result.Add(i);
end;
end;
procedure TestGenList(n : integer);
var
aInt : integer;
aGen : Generics.Collections.TList<Integer>;
begin
aGen := GetGen(n);
if aGen = nil then begin
WriteLn('No generic created!');
Exit;
end;
WriteLn(Format('Size: %d', [aGen.Count]));
for aInt in aGen do Write(Format('%d ', [aInt]));
aGen.Free; //will clear integers
end;
procedure TestGen
begin
TestGenList(0);
Readln;
TestGenList(5);
Readln;
end.
これは、私はC++でそれを行うことができる方法である:
unique_ptr<vector<int>> GetUniquePrtVec(int n){
if (n < 1) return(nullptr); //create only if correct input is given
unique_ptr<vector<int>> result (new vector<int>);
for (int i = 0 ; i != n; i++){
result->push_back(i);
}
return(move(result));
}
void TestPtrVec(int n){
unique_ptr<vector<int>> vec = GetUniquePrtVec(n);
if (vec == nullptr){
cout << "No vector created" << endl;
return;
}
cout << endl << vec->size() << endl;
for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;});
vec->clear(); //clear vector
vec.reset(nullptr);
}
void testVec3(){
TestPtrVec(0);
TestPtrVec(5);
}
私の質問は、右のイディオムについてです。経験豊かなC++プログラマ(私は初心者で、言語を学ぶだけです)、このようにしますか?もしそうでなければ、あなたはどうやってそれをしますか?
ありがとうございました。
あなたが書いたC++コードから初心者ではないようですね! – iammilind
ありがとう、私はプログラミングではなく、C++の初心者です:)私のジレンマを具体化するには、nullptrを調べるか、vec ptr変数を別の関数のどこかに空のベクトルを指すようにしますか? – Mihaela
これは文脈から答えるのは難しいです。 'GetUniquePtrVec'関数は無用に聞こえます(必要な場所にベクターを作るだけです)。さらに、 'vector'はすでに動的コンテナクラスであるため、動的管理の余分な層に包むことは非常に珍しいことです。個人的には、ここでは符号なし整数がより良いアプローチであると推測します。 –