Я имею доступ к array, который внутри класса C ++

Я не нашел манеру иметь доступ к array, который внутри моего полученного в наследство класса. Они могли бы помогать мне получать доступ к array? Как он мог бы делаться?

class FacultadMecanica:public Universidad
{

    private:

    public:

        void CarrerasFacultadMecanica(){
            string *Carreras;
            Carreras=new string[2];
            Carreras[0]="Ing.Quimica";
            Carreras[1]="Ing.Mecanica";
            Carreras[2]="Ing.Electrica";
        }           

};

Edit:

Спасибо за делание мне падать в счет ошибки, которые я совершил:)

Здесь я оставляю самый полный код, с main я пробую получать стоимость array, но дай ошибку в указанных линиях.

    // Example program
#include 
#include 
using namespace std;

class Persona
{

private:


public:

void CarrerasArry(){string *Carreras;Carreras=new string[2];Carreras[0]="Ing.Quimica";Carreras[1]="Ing.Mecanica";} 

};

int main()
{

Persona Datos;

//En las dos lienas siguientes da erro :

cout<

introducir la descripción de la imagen aquí

1
задан 13.04.2016, 23:19
1 ответ

Как общая норма, в C ++ есть две возможные формы, которых функция возвращала бы результат:

  • С типом возврата.
  • В аргументе из-за ссылки или указателя.

Первое, чтобы комментировать, перед тем, как входить в детали, на как возвращении информации, состоит в том, что у тебя есть огромная ошибка в твоей функции:

void CarrerasFacultadMecanica(){
  string *Carreras;
  Carreras=new string[2];
  Carreras[0]="Ing.Quimica";
  Carreras[1]="Ing.Mecanica";
  Carreras[2]="Ing.Electrica"; // <<<--- AQUI!!!
}

Если Carreras ты готовишь это для того, чтобы допускать 2 объекта типа string ты не можешь стремиться того, чтобы в вышеупомянутую договоренность они ввели три элемента. Если ты создаешь такую договоренность, которая int* arreglo = new int[10] ты должен осознавать, что arreglo только будешь допускать 10 целых чисел, доступных эти с индексами 0 в 9 и не 0-10). Эта ошибка вызывает, что пи-пи память твоей собственной программы, способствуя тому, чтобы этот смог вести себя блуждающей формы.

Чтобы предотвращать этот тип проблем обычно является рекомендуемым использовать контейнеры C ++. В твоем случае самое логическое состояло бы в том, чтобы использовать std::vector. С этим решением уже ты не был бы должен заботиться о размере договоренности:

void CarrerasFacultadMecanica(){
  std::vector<string> Carreras;
  Carreras.push_back("Ing.Quimica");
  Carreras.push_back("Ing.Mecanica");
  Carreras.push_back("Ing.Electrica");
}

Возвращаясь в твое сомнение, чтобы возвращать результат, произведенный внутри функции, есть, как общая норма, два возможных решения:

  • Возвращать результат используя возврат функции.
  • Хранить результат в аргументе, будучи этим указатель или ссылка.

Самый общий случай - первый и, примененный к твоей программе решение могло бы оставаться таким, что:

string* CarrerasFacultadMecanica(){
  string *Carreras;
  Carreras=new string[3];
  Carreras[0]="Ing.Quimica";
  Carreras[1]="Ing.Mecanica";
  Carreras[2]="Ing.Electrica";

  return Carreras;
}

Поскольку я прокомментировал тебе, также он мог бы храниться в аргументе, в этом случае ты должен осознавать, что аргумент должен быть ссылкой или указатель, а именно, должен добавлять уровень неадреса к переменной. Ввиду того, что переменная, которую нужно возвращать, - договоренность, договоренность, которую ты инициализируешь с new все было сказано, ты нуждался бы в двойном указателе:

void CarrerasFacultadMecanica(string** Carreras){
  *Carreras=new string[3];
  *Carreras[0]="Ing.Quimica";
  *Carreras[1]="Ing.Mecanica";
  *Carreras[2]="Ing.Electrica";
}

Это решение (прикладная так такая каков) выдвигает некие осложнения. Было бы нужно решать, например, что делать, если в функцию к нему прибывает указатель, который уже инициализировался. Нужно удалять это или достаточно игнорировать Ваше предыдущее состояние? У каждого выбора есть вовлечение, которое было бы нужно анализировать в детали.

Однако, если мы замечаем в рекомендацию, которую я предложил тебе ранее, и используем контейнеры stl решение становится более простым:

void CarrerasFacultadMecanica(std::vector<string>& Carreras){
  Carreras.clear(); // Borramos lo que haya en el vector
  Carreras.push_back("Ing.Quimica");
  Carreras.push_back("Ing.Mecanica");
  Carreras.push_back("Ing.Electrica");
}

Возвращать результат через аргумент может иметь смысл в тех ситуациях, в которых функция должна возвращать несколько типов различных результатов. Ввиду того, что посредством return только мы можем возвращать тип результата возможное решение состоит в том, чтобы использовать аргументы, чтобы возвращать оставшуюся часть. Хотя я настаиваю на том, что это возможное решение.

Были бы другие решения, как то, чтобы хранить результат в классе и предлагать это через getter, но ввиду отсутствия большего количества деталей мне казаться необходимым разрабатывать эту часть.

2
ответ дан 24.11.2019, 14:36

Теги

Похожие вопросы