0

私はこの問題で立ち往生しています:関数内で、関数に渡された動的に割り当てられた配列を参照によってサイズ変更する方法。私はこれを、まさにこのアプローチの無数のバリエーションとともに試しました。もちろん、これは単なる例です。"john" を 10 回出力し、参照渡しされた配列 (元々はサイズが 1 (つまり、 name は 1 つだけ) しかない) を展開する必要があります。

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int NumLast=-1;


int Surname(string *MyData)
{

          for (int i=0; i<10 ; i++)
          {
            NumLast++;
            string *Temp = new string[NumLast+1];   // temporary array 
            for (int jjj=0; jjj<NumLast; jjj++)
                Temp[jjj]=MyData[jjj];
            delete[] MyData;
            MyData=Temp;
            MyData[NumLast]="John";
          }
          return 0;
}


void main()
{ 
     string *Data = new string[1]; // inizializza l'array 
     Surname(&*Data);
     for (int iii=0; iii<10; iii++)
              cout << Data[iii] << endl; 

     system("pause");
} 
4

4 に答える 4

1

参照渡しする必要があります。あなたは値渡しをしています。あなたは得ています

&*Data                                              = Data
The value of the address of what is pointed to Data = Data

次に、それを値で Surname に渡します。それに対して何をしても、 には影響しSurnameません。Datamain

int Surname(string *MyData)  // This will take a copy of whatever you passed in to MyData

する必要があります (参照演算子は関数定義にある必要があります。)

int Surname(string*& MyData)
                  ^^

そして、呼び出しは

void main()
{ 
     string *Data = new string[1];
     Surname(Data);  // The function will take a reference of data.

なぜあなたがループに割り当てているのか聞いてもよろしいですか?

于 2013-04-06T19:07:18.933 に答える
0
  1. std::vector があなたのケースに最適なソリューションのようです。
  2. 本当に手動で再割り当てする必要がある場合は、昔ながらの malloc()、free()、realloc() インターフェースについて考えてみてください。覚えておくべき主なことは、通常は new / delete が malloc() / free() を使用して実装されているにもかかわらず、C++ の new/delete インターフェイスと混同しないことです。
  3. 配列が必要な場合は、配列ではなく、配列へのポインター (または参照) (ダブルポインター) を渡す必要があります。std::vector の場合、参照を渡すだけで十分です。
  4. std::vector への参照を使用するためのさらに別の引数 - 配列呼び出し元へのポインターの場合、新しい配列サイズを何らかの方法で通知する必要があります。
于 2013-04-06T19:11:00.510 に答える