2015-05-04 2 views
0

В принципе, в зависимости от того, вводит ли пользователь аргумент командной строки 0 или 1, я хочу, чтобы в моем классе данных был либо вектор, либо массив (статический). Я не верю, что можно добавить, если заявления в .h файлы, но я хотел бы сделать следующее:Использование аргументов командной строки для выбора типа данных?

/*A.h*/ 
//various functions 
private: 
if(argv[1] == 0) 
    vector b; 
else if(argv[1] == 1) 
    array b[10]; 

Есть простой способ сделать это? Благодаря!

+2

Это вопрос реализации и должно быть предложено на StackOverflow.SE. –

+0

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

ответ

3

C-type массивы и std :: vector имеют очень разные интерфейсы, поэтому, даже если бы вы смогли это сделать, было бы сложно написать значащий код, поскольку вектор имеет push_back(), empty() и т. Д. , а массивы - нет.

Что вы ищете, это один тип объекта с согласованным интерфейсом, который может иметь несколько реализаций под капотом (его можно реализовать с помощью массива C-стиля или стандартного вектора C++). Это называется полиморфизм и учебник о том, как добиться этого с C++ можно найти здесь: http://www.cplusplus.com/doc/tutorial/polymorphism/

+1

Укомплектованный образец кода отсутствует 'virtual int area() = 0;' – rwong

+0

@rwong Это не очень хороший пример, но объявление для функции виртуальной области находится далее по странице. – Derek

0

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

Так, например:

template<typename type_to_use> int template_main(int argc, char* argv[]) 
{ 
    type_to_use b; 
    // ... 
} 

int main(int argc, char* argv[]) 
{ 
    if (argv[1]==0) 
    template_main<vector>(argc, argv); 
    else 
    template_main<int[10]>(argc, argv); 
} 
+0

Какой значащий код может войти в template_main? С помощью массива вы можете сделать что-то вроде 'b [3] = 5', но с вектором, который будет делать плохие вещи, если вы не сделаете' b.reserve (3) 'first. Однако массив, конечно, не имеет метода 'reserve()', поэтому он не будет компилироваться. Вы можете перенести свой код с помощью проверок на argv [1], чтобы узнать, какой у вас тип, но это похоже на мир боли. Не создавая общий интерфейс для двух структур данных, я не вижу, как это возможно. –

+0

Вы можете использовать характерные черты и/или вызовы для перегруженных функций для покрытия различий. После инициализации оба могут использоваться с синтаксисом '[]' или в C++ 11 с циклом на основе диапазона; в противном случае также получение итераторов запуска/завершения (которые для массива являются указателями) могут выполняться в вспомогательных функциях. – celtschk

0

Есть простой способ сделать это?

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

class data { 
public: 
    virtual ~data() = 0; 
    // define public interface here 
}; 

class vector_data: public data { 
    std::vector<int> values; 
public: 
    // implement public interface here in terms of values 
}; 

class array_data: public data { 
    int values[20]; // or, std::array<int, 10> values; 
public: 
    // implement public interface here in terms of values 
}; 

std::unique_ptr<data> make_data(bool vector_data) 
{ 
    if(vector_data) 
     return { new vector_data() }; 
    return { new array_data(); } 
} 

int main(int argc, char* argv[]) 
{ 
    std::vector<std::string> args{ argv, argv + argc }; 
    auto data = make_data(args[1] == "vector" }; 
} 

данные будут инстанцирован для векторных данных только тогда, когда вы звоните:

> application.exe vector 
Смежные вопросы