web-dev-qa-db-ja.com

C ++関数で文字列配列を返す

C++は初めてです。学校のプロジェクトでは、文字列配列を返すことができる関数を作成する必要があります。

現在、これは私のヘッダーにあります:

Config.h

string[] getVehicles(void);

Config.cpp

string[] Config::getVehicles(){
string test[5];
test[0] = "test0";
test[1] = "test1";
test[2] = "test2";
test[3] = "test3";
test[4] = "test4";

return test;}

明らかにこれは機能しませんが、それが私がやろうとしていることの考え方です。 Javaでこれを行う方法になります。問題をグーグルで調べてみましたが、正直であることが明らかな答えは見つかりませんでした。

21
sn0ep

この場合はベクトルを使用する方が良いかもしれませんが、これは質問に対する正しい答えではありません。機能しない理由は、変数テストが関数のスコープ内に存在するだけだからです。したがって、メモリは自分で管理する必要があります。次に例を示します。

string* getNames() {
 string* names = new string[3];
 names[0] = "Simon";
 names[1] = "Peter";
 names[2] = "Dave"; 

 return names;
}

この場合、ヒープ内の位置のポインターを返します。ヒープ内のすべてのメモリを手動で解放する必要があります。したがって、メモリが不要になった場合は、メモリを削除する必要があります。

delete[] names;
26
GreenPepper

C++では、配列ではなくstd::vectorインスタンスを使用します。 C++の配列はコンパイル時に固定長である必要がありますが、std::vectorインスタンスは実行時に長さを変更できます。

std::vector<std::string> Config::getVehicles()
{
    std::vector<std::string> test(5);
    test[0] = "test0";
    test[1] = "test1";
    test[2] = "test2";
    test[3] = "test3";
    test[4] = "test4";
    return test;
}

std::vectorも動的に成長する可能性があるため、C++プログラムでは、次のようなものがより頻繁に見つかります

std::vector<std::string> Config::getVehicles()
{
    std::vector<std::string> test; // Empty on creation
    test.Push_back("test0"); // Adds an element
    test.Push_back("test1");
    test.Push_back("test2");
    test.Push_back("test3");
    test.Push_back("test4");
    return test;
}

std::stringの配列を動的に割り当てることは技術的には可能ですが、C++ではひどい考えです(たとえば、C++はJavaが持つ)ガベージコレクターを提供しません)。

C++でプログラミングしたい場合は、- 優れたC++の本を入手 を読んで、最初にカバーカバーを読んでください... Javaコードは、災害のレシピです表面的な中括弧の類似性にもかかわらず、言語は多くの基本的な点で非常に非常に異なっているためです。

12
6502

使う - std::vector<std::string>Cスタイルの配列よりも扱いがはるかに簡単です。

#include <string>
#include <vector>

...

std::vector<std::string> Config::getVehicles()
{
  std::vector<std::string> data;
  data.Push_back("hello");
  ...
  return data;
}

標準ライブラリの他のコンテナを確認してください。ほとんどの場合、C++のプレーン配列よりも優れた選択肢です。

getVehiclesメソッドがConfigオブジェクトの状態を変更しない場合は、constにすることを検討してください:

std::vector<std::string> Config::getVehicles() const { ... }
7
Mat

これを試して

#include <iostream>
#include <string>

using namespace std;

string * essai()
    {
    string * test = new string[6];
    test[0] = "test0";
    test[1] = "test1";
    test[2] = "test2";
    test[3] = "test3";
    test[4] = "test4";
    cout<<"test et *test\t"<<&test<<' '<<*(&test)<<'\n';
    return test;
    }

main()
    {
    string * toto;
    cout<<"toto et *toto\t"<<&toto<<' '<<*(&toto)<<'\n';
    toto = essai();
    cout<<"**toto\t"<<*(*(&toto))<<'\n';
    cout<<"toto\t"<<&toto<<' '<<*(&toto)<<'\n';
    for(int i=0; i<6 ; i++)
        {
        cout<<toto[i]<<' '<<&toto[i]<<'\n';
        }
    }

たとえば、私のコンピュータでは、結果は

toto et *toto   0x7ffe3a3a31b0 0x55dec837ae20
test et *test   0x7ffe3a3a3178 0x55dec9ddd038
**toto  test0
toto    0x7ffe3a3a31b0 0x55dec9ddd038
test0 0x55dec9ddd038
test1 0x55dec9ddd058
test2 0x55dec9ddd078
test3 0x55dec9ddd098
test4 0x55dec9ddd0b8
 0x55dec9ddd0d8

アドレスとアドレスの内容を取得すると、C++の配列が本当に初歩的であることを理解するのに役立ちます。メソッドは提供されず、メモリを割り当てることなくインデックスにアクセスできます(ループ内の値6)。最初の例はローカル配列(テスト)の直接割り当てを示しているので、それを返すことはできません(ローカル配列は終了します)。この例では、ローカル変数も終了しますが、常にこの部分にアクセスする変数がありますメモリ、関数、関数の結果を受け取る変数が割り当てられているため、関数の呼び出し後に変数testは停止していますが、メモリは割り当てられたままです。よろしく。

0