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でこれを行う方法になります。問題をグーグルで調べてみましたが、正直であることが明らかな答えは見つかりませんでした。
この場合はベクトルを使用する方が良いかもしれませんが、これは質問に対する正しい答えではありません。機能しない理由は、変数テストが関数のスコープ内に存在するだけだからです。したがって、メモリは自分で管理する必要があります。次に例を示します。
string* getNames() {
string* names = new string[3];
names[0] = "Simon";
names[1] = "Peter";
names[2] = "Dave";
return names;
}
この場合、ヒープ内の位置のポインターを返します。ヒープ内のすべてのメモリを手動で解放する必要があります。したがって、メモリが不要になった場合は、メモリを削除する必要があります。
delete[] names;
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コードは、災害のレシピです表面的な中括弧の類似性にもかかわらず、言語は多くの基本的な点で非常に非常に異なっているためです。
使う - 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 { ... }
これを試して
#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は停止していますが、メモリは割り当てられたままです。よろしく。