Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

Как не допустить повторное использование кода - C++

01.08.2014, 16:34. Просмотров 283. Ответов 6
Метки нет (Все метки)

Здравствуйте.
У меня есть один заголовочный файл, и в нем присутствует пара констант и функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef H_H
#define H_H
 
.......
 
const std::string CARDS_NAMES[4] =
    {
        "Jack", "Queen", "King", "Ace"
    };
 
......
 
friend std::ostream& operator<< (std::ostream& os, const Playing_card& pc);
 
....
 
#endif
Мне нужно сделать так, что бы в зависимости от какого то условия они менялись, а именно - в зависимости от условия перевести константы на другой язык и немного изменить оператор вставки. Как это можно сделать? Самое простое решение - полностью скопировать весь текст хедера в другой хедер и изменить эти константы. Но как можно провернуть получше? Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 16:34     Как не допустить повторное использование кода
Посмотрите здесь:

Повторное использование кода в C++ - C++
Всем доброго дня! Прошу помочь начинающему. В данный момент обучаюсь по книге Прата С.. Застрял на задаче про использование класса...

Повторное использование кода - C++
Предположим для класса перегружен oператор+ который принимает либо строку в стиле С, или такой же объект. myString...

Повторное использование кода и инкапсулирование. Внимание, много букв) - C++
Всем привет. Хотелось бы обсудить очень важный вопрос, а именно инкапсуляцию встроенных типов. Допустим у нас в программе есть две...

Повторное выполнение кода - C++
Здравствуйте! Ребята как я могу сделать так чтобы эта программа т.е Калькулятор повторил свою работу каждый раз когда я получаю свой...

Как не допустить выход вектора из диапазона - C++
Здравствуйте! Подскажите, пожалуйста. Мне дана задача: Прочитайте набор целых чисел в вектор. Отобразите сумму каждой пары соседних...

Оптимизация кода с использование SIMD - C++
Есть код inline double dot(const float* v1, const float* v2) { return v1 * v2 + v1 * v2 + v1 * v2; } Переписал его вот...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5464 / 1830 / 338
Регистрация: 10.12.2010
Сообщений: 5,412
Записей в блоге: 3
01.08.2014, 16:41     Как не допустить повторное использование кода #2
Для совета получше дайте пожалуйста больше деталей того, что вы сделать хотите. Особенно про оператор.
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
01.08.2014, 16:43  [ТС]     Как не допустить повторное использование кода #3
HighPredator, допустим, у меня должно быть две версии этого хедера: этот хедер и ТОЧНО такой же хедер, но с измененными константами и этим оператором, который из-за перевода констант нуждается в небольшом изменении. Как это лучше сделать без переписывания кода, думаю как то попробовать с помощью #include, #define и #ifndef.
HighPredator
5464 / 1830 / 338
Регистрация: 10.12.2010
Сообщений: 5,412
Записей в блоге: 3
01.08.2014, 16:48     Как не допустить повторное использование кода #4
Смотрите, вам нужно для себя четко решить следующее: вам нужен исходный текст ваших хэдеров в двух ипостасях в рамках физически одного файла? Если да, то действительно разумнее использовать директивы препроцессора. Если же вам надо в реалтайме менять функционал, то тогда другие методы. Но надо знать контекст задачи.
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
01.08.2014, 16:50  [ТС]     Как не допустить повторное использование кода #5
HighPredator, вот я набросал, константы и оператор убрал из того хедера, и добавил измененные во второй (названия изменил, но это не суть). и если нужно подключать русский вариант, то подключаем этот хедер:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef CARD_RUS_H
#define CARD_RUS_H
 
#include "card_base.h"
#include <string>
 
const std::string JACK_NAME = "Валет";
const std::string QUEEN_NAME = "Королева";
const std::string KING_NAME = "Король";
const std::string ACE_NAME = "Туз";
 
const std::string CLUBS_NAME = "треф";
const std::string DIAMONDS_NAME = "бубен";
const std::string HEARTS_NAME = "черви";
const std::string SPADES_NAME = "пики";
 
std::ostream& card::operator<< (std::ostream& os, const Playing_card& pc)
{
    os << pc.value_.text_val << " " << pc.suit_.text_val;
    return os;
}
 
#endif
Но с другой стороны, что подключать к файлу с реализацией?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
01.08.2014, 17:22     Как не допустить повторное использование кода #6
Пишем функцию, которая принимает на вход текущий язык и идентификатор карты и масти. На выходе - человекопонятная строка на запрошенном языке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2014, 18:04     Как не допустить повторное использование кода
Еще ссылки по теме:

Использование кода символа внутри строки? - C++
Как должна выглядеть стока, содержащая символ с определённым кодом? Можно как то вместо L&quot;начало&quot;+(wchar_t)0xAB+L&quot;конец&quot; набрать всё...

Использование dll без оригинального кода - C++
Добрый день. Имею следующую проблему: Есть библиотека dll без оригинального кода. Открываю её ПЕ Експлорером вижу некоторые импорт и...

Повышение эффективности кода: использование указателя на функцию - C++
Решил всё-таки наконец добить тему с &quot;Динамическим приложением, использующим конфиги&quot; Есть псевдо-класс для манипуляции с персонажем в...

Необходимо не допустить ввод символьных данных, используя механизм исключений - C++
Добрый вечер. Во время выполнения программы возникает необходимость ввести числа с клавиатуры (тип int). В чём собственно вопрос -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
01.08.2014, 18:04     Как не допустить повторное использование кода #7
CHELOVEKPAUK, если я правильно понял что Вы хотите, то для работы в рантайме можно просто проинициализировать константы на двух языках, а потом в зависимости от выбранного языка использовать конкретную "локаль":

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <iostream>
 
using std::string;
using std::cout;
using std::endl;
 
struct words {
    explicit words(const string &JN, const string &QN, const string &KN, const string &AN,
                    const string &CN, const string &DN, const string &HN, const string &SN) : JACK_NAME(JN), QUEEN_NAME(QN),
                    KING_NAME(KN), ACE_NAME(AN), CLUBS_NAME(CN), DIAMONDS_NAME(DN), HEARTS_NAME(HN), SPADES_NAME(SN) {}
 
    const string JACK_NAME, QUEEN_NAME, KING_NAME, ACE_NAME, CLUBS_NAME, DIAMONDS_NAME, HEARTS_NAME, SPADES_NAME;
};
 
int main()
{
    words rus("Валет", "Королева", "Король", "Туз", "треф", "бубен", "черви", "пики");
    //words en(/* ваши аналоги на английском */);
    cout << rus.JACK_NAME << endl;
    return 0;
}

Если Вам надо с условной компиляцией, то придётся пилить два куска кода и перед ним делать #define. Например (опираясь на мою реализацию):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string>
 
using std::string;
 
struct words {
    explicit words(const string &JN, const string &QN, const string &KN, const string &AN,
                    const string &CN, const string &DN, const string &HN, const string &SN) : JACK_NAME(JN), QUEEN_NAME(QN),
                    KING_NAME(KN), ACE_NAME(AN), CLUBS_NAME(CN), DIAMONDS_NAME(DN), HEARTS_NAME(HN), SPADES_NAME(SN) {}
 
    const string JACK_NAME, QUEEN_NAME, KING_NAME, ACE_NAME, CLUBS_NAME, DIAMONDS_NAME, HEARTS_NAME, SPADES_NAME;
};
 
// где-то инициализируете локаль
words init() {
#ifdef RUS
return words("Валет", "Королева", "Король", "Туз", "треф", "бубен", "черви", "пики");
#endif
// иначе на английском
return words(/* Ваш аналог на англ */);
}
 
// и где-то в файле реализации
#define RUS
#include "myheader"
// в main или ещё где-то
words _tmylocale = init();

Пример с использованием моей реализации неудачный, потому что это бред - проще передать int в функцию и сравнить через if, после чего вернуть нужную "локаль". А в Вашем случае придётся писать n практически одинаковых строк кода.
Очень хорошо было бы вот так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <string>
 
using std::string;
 
struct words {
    explicit words(const string &JN, const string &QN, const string &KN, const string &AN,
                    const string &CN, const string &DN, const string &HN, const string &SN) : JACK_NAME(JN), QUEEN_NAME(QN),
                    KING_NAME(KN), ACE_NAME(AN), CLUBS_NAME(CN), DIAMONDS_NAME(DN), HEARTS_NAME(HN), SPADES_NAME(SN) {}
 
    const string JACK_NAME, QUEEN_NAME, KING_NAME, ACE_NAME, CLUBS_NAME, DIAMONDS_NAME, HEARTS_NAME, SPADES_NAME;
};
 
words getloc(int l = 0) {
    if (l)
        return words("Валет", "Королева", "Король", "Туз", "треф", "бубен", "черви", "пики");
    return words( /* english */ );
}
 
int main()
{
    words myloc = getloc(1); // RUS
    // или следующий вариант в зависимости от ситуации
    words myloc = getloc(); // EN
    return 0;
}
Yandex
Объявления
01.08.2014, 18:04     Как не допустить повторное использование кода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru