Return string array in C++ function

前端 未结 3 1238
名媛妹妹
名媛妹妹 2021-01-31 19:12

I am new to C++. For a school project I need to make a function which will be able to return a string array.

Currently I have this in my header:

Config.h

相关标签:
3条回答
  • 2021-01-31 19:33

    Maybe it is better to use a vector in this case, but this is not a correct answer for the question. The reason why it doesn't work is that the variable test just exists in the scope of your function. So you have to manage the memory on your own. Here is an example:

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

    In this case you return a pointer of the position in the heap. All the memory in the heap has to free manually. So it is now your work to delete the memory, if you don't need it anymore:

    delete[] names;
    
    0 讨论(0)
  • 2021-01-31 19:53

    Try this

    #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';
            }
        }
    

    For example, in my computer, the result is

    toto et *toto   0x7ffe3a3a31b0 0x55dec837ae20
    test et *test   0x7ffe3a3a3178 0x55dec9ffffd038
    **toto  test0
    toto    0x7ffe3a3a31b0 0x55dec9ffffd038
    test0 0x55dec9ffffd038
    test1 0x55dec9ffffd058
    test2 0x55dec9ffffd078
    test3 0x55dec9ffffd098
    test4 0x55dec9ffffd0b8
     0x55dec9ffffd0d8
    

    Getting addresses and contents of addresses could help you to understand that an array in c++ is really rudimentary : it offers no methods and you could access an index without allocating memory (the value 6 in the loop). Your first example show a direct allocation of a local array (test), so you can't return it (the local array dies), in this example, the local variable dies also but there is always a variable that access at this part of allocated memory, the function, and then the variable that receive the result of the function, so the variable test is dead after the calling of the function but the memory is still allocated. Regards.

    0 讨论(0)
  • 2021-01-31 19:54

    In C++ you don't use an array, but a std::vector instance. Arrays in C++ must have a compile-time fixed length while std::vector instances can change their length at runtime.

    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 can also grow dynamically, so in a C++ program you will find more often something like

    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;
    }
    

    Allocating dynamically an array of std::string is technically possible but a terrible idea in C++ (for example C++ doesn't provide the garbage collector that Java has).

    If you want to program in C++ then grab a good C++ book and read it cover to cover first... writing Java code in C++ is a recipe for a disaster because the languages, despite the superficial braces similarity, are very very different in many fundamental ways.

    0 讨论(0)
提交回复
热议问题