Ссылки на данные в структуре с помощью переключателя в C ++ - PullRequest
0 голосов
/ 25 сентября 2018

В моем коде есть оператор switch для выбора между несколькими случаями.В зависимости от выбора, я хотел бы загрузить определенный набор данных и использовать этот набор данных для оставшейся части программы.Также одной из проблем является то, что массивы в моих структурах будут произвольной длины.Чего я пытаюсь избежать, так это переписывать мою основную программу несколько раз для каждого случая.Мои данные включены в мой файл scenariodata.h, а моя программа находится в test.cpp.Сейчас он не компилируется, но если он работает так, как я хочу, в консоли должно отображаться «10».Заранее большое спасибо.

test.cpp

#include <iostream>
#include "scenarioData.h"

int main(){
    int choice = 1;

    //initialize a blank struct with generic name 'sd'
    sd_fmt sd;

    switch((int) choice){
        //Make a decision of which data set to use
        case 1:
            std::cout << "Using data1\n";
            sd = data1;
            break;
        case 2:
            std::cout << "Using data2\n";
            sd = data2;
            break;
    }

    //From here on do all my work with general variable name 'sd'
    std::cout << sd.speed[1];  //Should show 10 in the console

    return 0;
}

scriptData.h

struct sd_fmt {
    double *speed;
};

struct sd_fmt {
    double speed[4] = {1,10,100,1000};
} data1;

struct sd_fmt{
    double speed[5] = {2,200,2000, 20,20000};
} data2;

1 Ответ

0 голосов
/ 25 сентября 2018

Я обновил фрагмент до более современного стиля C ++.

Определения структуры были перепутаны с объявлением экземпляров структуры.Вместо создания структуры, содержащей указатель, используется std :: vector.По возможности следует избегать использования указателя.

Вектор имеет несколько преимуществ, в том числе и с переменным размером.Инициализация вектора также проста.Если вектор имеет известный размер, тогда элемент at () может использоваться для доступа к конкретному элементу.

Оператор switch создает копию вектора, которая не является идеальной.Если бы вектор был очень большим, то использование ссылки на вектор было бы более эффективным.Для этого небольшого примера это не проблема.

#include <vector>
#include <iostream>

using sd_fmt = std::vector<double>;

sd_fmt data1 = {1,10,100,1000};
sd_fmt data2 = {2,200,2000, 20,20000};

int main(){
    int choice = 1;

    //initialize a blank struct with generic name 'sd'
    sd_fmt sd;

    switch((int) choice){
        //Make a decision of which data set to use
        case 1:
        std::cout << "Using data1\n";
        sd = data1;
        break;
        case 2:
        std::cout << "Using data2\n";
        sd = data2;
        break;
    }

    //From here on do all my work with general variable name 'sd'
    std::cout << sd.at(1);  //Should show 10 in the console

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...