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

Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 07:44     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #1
Друзья! Дело в следующем, вот у меня есть функции X и Y. И вот мне не хотелось бы вызывать X прежде, чем будет вызвана Y. Но это всё в пользовательском классе реализовано, которым возможно будут пользоваться другие люди вот они по запарке могут ошибиться и сперва вызвать Y, а потом X. Да и я могу также сделать. Короче как сделать защиту от дураков такого рода? Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2011, 07:44     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной?
Посмотрите здесь:

как сделать программно чтобы программа была постоянно на заднем плане C++
C++ как сделать так чтобы была возможность записывать и фамилию и имя,а то у меня только до пробела читает?
Как сделать так, чтобы программа понимала русские буквы? C++
рабочая программа. но нужно ее переписать так, чтобы она была наиболее общей. C++
Как сделать так чтобы переменная в описании одной функции была доступна в описании другой? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 07:55     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #2
так пойдет?
C
1
2
3
4
5
6
7
void X(){}
 
void Y()
{
    X();
   ...
}
а если они не взаимно связаны, то можно в приват кинуть флаг, который становится труЪ при вызове Х(), проверяется на труЪ в Y(), и в Y() же в конце ставится в не труЪ

Добавлено через 4 минуты
короче через триггер пусти.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 07:58  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #3
Не пойдёт, вызываться не бутдет, а компилиться будет. А как через триггер? А я забыл сказать, уменя компилятор g++
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 08:04     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #4
ну чтобы не компилилась я не знаю, если синтаксически правильно то все скомпилится. Триггер можно реализовать по разному. Это "железное" понятие. Его роль выполняет флаг. Например в дефолте флаг всегда ложь, становится истиной только в функции X(), а проверяется на истинность в функции Y() и в ней же устанавливется обратно в ложь. Это и есть такая вот абстрактная модель триггера, в роли которого выступает флаг.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 14:30     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #5
Костыль:

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 <iostream>
 
#define second() if (first_call_flag) second_helper()
 
bool first_call_flag = false;
 
void first()
{
    first_call_flag = true;
 
    std::cout << "fisrt()" << std::endl;
}
 
void second_helper()
{
    std::cout << "second()" << std::endl;
}
 
int main()
{
    second();
    first();
    second();
    
    return 0;
}
Добавлено через 3 минуты
Когда функция начинает возвращать значение - начинаются проблемы...
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 19:27  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #6
Это компилится, а надо чтобы не компилилось
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 21:27     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #7
kravam, если надо чтобы не компилилось - надо писать синтаксически неверную программу. Иначе у компилятора нет никаких причин не генерировать код.
Если у вас встала такая проблема - следует пересмотреть архитектуру. Конструкторы придумали для того, чтобы пользователь получал при создании полностью готовый к работе класс. Вы же откинули этот принцип и вернулись к старому доброму Си (да и любому структурному языку), когда пользователь обязан был всю подготовительную работу производить сам.
Почему бы просто не вызывать первую функцию первым делом во второй?
Короче говоря, всё это попахивает быдлокодом и неверной архитектурой. Может, более конкретно опишите задачу?

Не по теме:

В новом стандарте есть ассерты стадии компиляции, может, они подойдут.

kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 21:51  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #8
Ну у меня просто есть хитрая структура, которая состоит из двух векторов: из вектора значений int и из вектора индексов вектора значений.
struct str {
vector <int> znach;
vector <int> index;
}

Второй вектор очень важен, он изменяется вот в такой функции
C++
1
2
3
f (&str) {
 //здесь всякие хитрые действия, изменяющие вектор индексов по определённому правилу
}
Следовательно, очень важно правильно инициализировать вектор индексов значениями от 0 до размера вектора значений
C++
1
2
3
4
5
6
7
То есть инициализируем ветор значений:
str.push_back (20);
str.push_back (25);
str.push_back (19);
 
 
//А тут просто вызов функции, которая смотрит размер вектора str.znach и согласно ему //инициализирует ветор индексов. Без пролем
Всё ясно, надеюсь? То есть вектор индексов по-любому должен быть равен размеру вектора значений. А теперь представим, что я лажанулся и написал так:

C++
1
2
3
4
5
6
7
8
9
То есть инициализируем ветор значений:
str.push_back (20);
 str.push_back (25);
 str.push_back (19);
 
 
//А тут просто вызов функции, которая смотрит размер вектора str.znach и  согласно ему //инициализирует ветор индексов. Без пролем
 
str.push_back (67);
А вот тут и получается, что у меня вектор индексов меньше вектора значений, а это плохо вот и хочется чтобы компилятор ругнулся на последний вызов str.push_back (19);

...Так-то я щас сделал так: при каждом увеличении вектора значений вектор индексов автоматом увеличивается на единицу соответствущим значением. Но мне пришлось для этого усложнять структуру, писать специальную функцию push_back_(), то есть теперь так:
C++
1
2
3
str.push_back_ (20); //вектор индексов автоматом увеличился
  str.push_back_ (25); //то же самое
  str.push_back_ (19); //то же самое
Вроде всё ничё, но хотелось бы всё же обойтись минимум наворотов, к коим я отношу push_back_, хочется обойтись простым push_back.

Добавлено через 2 минуты
В первом и втором примерах надо писать так:

C++
1
2
3
str.znach.push_back (20);
str.znach.push_back (25);
str.znach.push_back (19)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 22:01     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #9
kravam, не совсем понятно, что сложного в увеличении вектора индексов при добавлении значений? Определяем для структуры push_back, тогда не придётся лезть в её внутренности, а внутри этого пуш_бэка добавляем переданный ему элемент в вектор значений, и вектор индексов увеличиваем. Так будет куда лучше.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 22:14  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #10
Так я так и сделал один к одному, я определил эту функцию
push_back_
И дальше согласно тык сктыть инструкциям

Но мне не хочется использовать определённую МНОЙ push_back_, я же говорю, хочется обойтись стандартным push_back, а ошибки отслеживать через сообщения компилятора
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 22:19     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #11
kravam, во-первых, почему push_back_, а не push_back? Любите выделяться и не сохранять общность? Во-вторых, почему вы так не хотите использовать собственную функцию, если это будет куда более правильным, чем лезть внутрь структуры и доставать пушбэк оттуда? Одна лишняя операция адресации, несколько лишних символов. Ну и в-третьих, я уже сказал, вы никак не сможете повлиять на компилятор и заставить его выдать ошибку в абсолютно правильном коде. Какую ошибку вы вообще намеревались получить?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 22:33  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #12
Начну с конца. Так-то хотелось бы получить сообщение "функция Y вызвана после функции X".
На худой конец сошло бы ЛЮБОЕ сообщение, лишь бы оно было вызвано именно этой проблемой. Да, и чтобы номер строки в сообщении был. Тгда бы я уж разобрался что к чему.

Собственную функцию я уже два раза объяснил почему не хочу использовать. Если у меня есь набор стандартных функций, допустим X, Y и Z то добавление к ним какой-бы то ни было функции A я считаю безусловным злом. Другое дело, что недобавление функции A влечёт за собой ещё бльшее зло. Вот щас я и разбираюсь, какое из двух зол выбрать.

Либо добавляю свою функцию push_back_, которая упрощает мне жизнь СЕЙЧАС, и глядя на которую через месяц я мучительно вспоминаю, что она значит, либо ни щас ни через месяц ничем не заморачиваюсь, а решаю проблемы по мере их поступления, то есть: компилятор ругнулся- нашёл ошибку и исправил.

А как вообще переопределять стандартную функцию push_back ()? Я ни разу не делал, я переопределял только свои функции.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2011, 22:55     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #13
Вариант:
ф-ия X возвращает такой тип результата, который принимает ф-ия Y и только У. И больше никто и никак не может работать с типом такого результата, кроме класса, у которого эти ф-ии X и У. Ну т.е. единственное полезное применение такому классу - это отдать его в ф-ию Y. У такого типа даже интерфейса нет, публичным могут быть только конструктор копирования и оператор =. все остальное - приватное и доступно только для класса с методами X и Y.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 22:58     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #14
он хочет компиль свой хакнуть, а не выход из положения найти.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 23:16  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #15
silent_1991, один вопрос. Я щас переопределил push_back() у меня всё получилось, в принципе всё нормально, теперь заполнение вектора индексов осуществляется автоматом и новведений, о которых можно спотыкаться глазом, не пришлось вводить.

Но насколько это грамотно с технической точки зрения? Может быть я просто обманул компилятор?
(Сам по мебе обман компилятора для меня приемлем, если я ЗНАЮ, что делаю) А тут всё внове, не могу себе представить последствий такого шага. Чё-то я упустил в обучении такой момент как переопрееление стандартных функций, не всречал нигде.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2011, 23:24     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #16
Вообще сам подход какой-то кривой.
Если например ф-ия принимает указатель на что-то, но не работает с нулевыми указателями - компилятор никак не заставишь выдать ошибку, которая только в рантайме может возникнуть. Тут или тип аргумента надо менять (например на ссылку в случае с указателями), или свойства типа (хитрый интерфейс у типа, который как параметр передается, чтобы затруднить пользователям такой ф-ии наступить себе на яйца), или же ф-ия должна проверять агрументы на предмет их валидности и как-то осознано реагировать на невалидные агрументы, а не разваливаться на пол пути своего выполнения. То же самое и с векторами этими. Кидайте неуловимые исключения чтоли. В дебаге это без проблем ловится и клиенты класса не останутся с неисправленным кодом.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 23:26     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #17
kravam, да ничего вы не переопределили. У вас структура наследник вектора? Нет. Так почему вы думаете, что что-то переопределили? Вы просто определили метод с именем push_back для своей структуры. Компилятор не находт конфликтов и всё компилируется. С синтаксической точки зрения всё правильно, семантику именам методов придаёт только программист.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
14.12.2011, 23:30  [ТС]     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #18
silent_1991, ну как-то это всё для меня странно. Ладно, попробую поработать так, авось выгорит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 23:34     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной?
Еще ссылки по теме:

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? C++
C++ Программа работает только с одним разрешением экрана, как сделать чтобы она была универсальна
C++ Как обратиться к объекту bitset так, чтобы результатом была битовая маска

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.12.2011, 23:34     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной? #19
kravam, что странного-то? Это не более странно, чем метод push_back в векторе и метод push_back в списке. Они никак не связаны, просто называются одинаково. Как вектор, так и список - контейнеры, как в одном, так и в другом есть метод добавления элемента в конец. Так назовите хоть одну причину не назвать эти методы одинаково и там, и там?
Yandex
Объявления
14.12.2011, 23:34     Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной?
Ответ Создать тему
Опции темы

Текущее время: 13:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru