1

これは簡単な問題だと思いますが、気が狂いそうです: 1 つのメソッドから複数の配列を返したいのですが、呼び出し元のメソッドはそのサイズを事前に知りません。そのため、メソッド内でこれらの配列を作成する必要があり (単に埋めるのとは対照的に)、 を使用してそれらを返すことはできませんreturn

だから私が欲しいのは、次のようなメソッドシグネチャです:

void giveMeArray(int[] *anArray)

メソッド署名には、例を単純化するためのパラメーターが 1 つしかありません。次のような署名も使用できると仮定してください

void giveMeArrays(int[] *anArray, float[] *anotherArray)

そのメソッド内でgiveMeArray、配列を構築します

*anArray = new int[5];

を使用してそのメソッドを呼び出します

int[] result;
giveMeArray(&result);

ただし、これ (メソッド シグネチャから始まる) はすべて、少なくとも構文的に間違っています。申し訳ありませんが、今のところコンパイラ エラーは手元にありません。何が問題なのかわかる方もいらっしゃると思います。

編集std::vector が最良の(最もクリーンな)アプローチであることはわかっていますしかし、皆さん、それは問題ではありませんでした。

4

4 に答える 4

5

シングルを返しますvector(これは結局のところC++です)

void giveMeArray(std::vector<int>& anArray)
{
   anArray = std::vecotr<int>(5);
}

ベクトルのベクトルを返します。

void giveMeArray(std::vector<std::vector<int> >& anArray)
于 2012-08-21T22:21:44.517 に答える
2
std::vector<int> giveMeArray() {
    std::vector<int> ret;
    ret.resize(5);
    return ret;
}

優れたリソースのクリーンアップ、デバッグモードでの境界チェックなど。すべての家族に適しています。

于 2012-08-21T22:44:26.070 に答える
2
void giveMeArray(int **anArray);

int *result;
giveMeArray(&result);
于 2012-08-21T22:25:38.253 に答える
0

配列をクラスまたは構造体でラップすることを検討してください。

struct Arrays {
    int *ints;
    int intCount;
    double *doubles;
    int doubleCount;
};

Arrays giveMeArrays() {
    Arrays arrays;
    arrays.ints = new int[10];
    arrays.intCount = 10;
    arrays.doubles = new double[20];
    arrays.doubleCount = 20;
    return arrays;
}

std::pair<>別の方法は、またはを使用することですstd::tuple<>が、私の経験では、これらを使用すると、最終的に名前付きタイプになります。それらがすべて関数の結果の一部であるという事実は、それらがオブジェクトになるのに十分な一貫性を持っている可能性があることを示唆しています。ユーザー定義型を使用すると、データの受け渡しが容易になり、コードのリファクタリングが容易になります。giveMeArrays()それがこのオブジェクトのメンバー関数になることさえあるかもしれません。

可能であれば、ints/intCountをに置き換えた方がよいでしょう。std::vector<int>そうでない場合は、アレイにメモリ管理の責任を負わせたり、移動を許可しながらコピーを無効にしたりすることができます。

于 2012-08-22T16:28:20.347 に答える