Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
#1

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

14.12.2011, 07:44. Просмотров 959. Ответов 18
Метки нет (Все метки)

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

как сделать так чтобы была возможность записывать и фамилию и имя,а то у меня только до пробела читает?
здраствуйте!скажите пож-та как сделать так чтобы была возможность записывать и...

как сделать программно чтобы программа была постоянно на заднем плане
Суть вопроса как сделать программно чтобы программа была постоянно на заднем...

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат?
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие...

Программа работает только с одним разрешением экрана, как сделать чтобы она была универсальна
Написал простенький кликер на с++, который в игре нажимает кнопочки от 1 до 9,...

Как сделать так чтобы переменная в описании одной функции была доступна в описании другой?
Как сделать так чтобы переменная в описании одной функции была доступна в ...

18
alkagolik
Заблокирован
14.12.2011, 07:55 #2
так пойдет?
C
1
2
3
4
5
6
7
void X(){}
 
void Y()
{
    X();
   ...
}
а если они не взаимно связаны, то можно в приват кинуть флаг, который становится труЪ при вызове Х(), проверяется на труЪ в Y(), и в Y() же в конце ставится в не труЪ

Добавлено через 4 минуты
короче через триггер пусти.
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
14.12.2011, 07:58  [ТС] #3
Не пойдёт, вызываться не бутдет, а компилиться будет. А как через триггер? А я забыл сказать, уменя компилятор g++
0
alkagolik
Заблокирован
14.12.2011, 08:04 #4
ну чтобы не компилилась я не знаю, если синтаксически правильно то все скомпилится. Триггер можно реализовать по разному. Это "железное" понятие. Его роль выполняет флаг. Например в дефолте флаг всегда ложь, становится истиной только в функции X(), а проверяется на истинность в функции Y() и в ней же устанавливется обратно в ложь. Это и есть такая вот абстрактная модель триггера, в роли которого выступает флаг.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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 минуты
Когда функция начинает возвращать значение - начинаются проблемы...
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
14.12.2011, 19:27  [ТС] #6
Это компилится, а надо чтобы не компилилось
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.12.2011, 21:27 #7
kravam, если надо чтобы не компилилось - надо писать синтаксически неверную программу. Иначе у компилятора нет никаких причин не генерировать код.
Если у вас встала такая проблема - следует пересмотреть архитектуру. Конструкторы придумали для того, чтобы пользователь получал при создании полностью готовый к работе класс. Вы же откинули этот принцип и вернулись к старому доброму Си (да и любому структурному языку), когда пользователь обязан был всю подготовительную работу производить сам.
Почему бы просто не вызывать первую функцию первым делом во второй?
Короче говоря, всё это попахивает быдлокодом и неверной архитектурой. Может, более конкретно опишите задачу?

Не по теме:

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

1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
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)
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.12.2011, 22:01 #9
kravam, не совсем понятно, что сложного в увеличении вектора индексов при добавлении значений? Определяем для структуры push_back, тогда не придётся лезть в её внутренности, а внутри этого пуш_бэка добавляем переданный ему элемент в вектор значений, и вектор индексов увеличиваем. Так будет куда лучше.
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
14.12.2011, 22:14  [ТС] #10
Так я так и сделал один к одному, я определил эту функцию
push_back_
И дальше согласно тык сктыть инструкциям

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

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

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

А как вообще переопределять стандартную функцию push_back ()? Я ни разу не делал, я переопределял только свои функции.
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2011, 22:55 #13
Вариант:
ф-ия X возвращает такой тип результата, который принимает ф-ия Y и только У. И больше никто и никак не может работать с типом такого результата, кроме класса, у которого эти ф-ии X и У. Ну т.е. единственное полезное применение такому классу - это отдать его в ф-ию Y. У такого типа даже интерфейса нет, публичным могут быть только конструктор копирования и оператор =. все остальное - приватное и доступно только для класса с методами X и Y.
1
alkagolik
Заблокирован
14.12.2011, 22:58 #14
он хочет компиль свой хакнуть, а не выход из положения найти.
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
14.12.2011, 23:16  [ТС] #15
silent_1991, один вопрос. Я щас переопределил push_back() у меня всё получилось, в принципе всё нормально, теперь заполнение вектора индексов осуществляется автоматом и новведений, о которых можно спотыкаться глазом, не пришлось вводить.

Но насколько это грамотно с технической точки зрения? Может быть я просто обманул компилятор?
(Сам по мебе обман компилятора для меня приемлем, если я ЗНАЮ, что делаю) А тут всё внове, не могу себе представить последствий такого шага. Чё-то я упустил в обучении такой момент как переопрееление стандартных функций, не всречал нигде.
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2011, 23:24 #16
Вообще сам подход какой-то кривой.
Если например ф-ия принимает указатель на что-то, но не работает с нулевыми указателями - компилятор никак не заставишь выдать ошибку, которая только в рантайме может возникнуть. Тут или тип аргумента надо менять (например на ссылку в случае с указателями), или свойства типа (хитрый интерфейс у типа, который как параметр передается, чтобы затруднить пользователям такой ф-ии наступить себе на яйца), или же ф-ия должна проверять агрументы на предмет их валидности и как-то осознано реагировать на невалидные агрументы, а не разваливаться на пол пути своего выполнения. То же самое и с векторами этими. Кидайте неуловимые исключения чтоли. В дебаге это без проблем ловится и клиенты класса не останутся с неисправленным кодом.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.12.2011, 23:26 #17
kravam, да ничего вы не переопределили. У вас структура наследник вектора? Нет. Так почему вы думаете, что что-то переопределили? Вы просто определили метод с именем push_back для своей структуры. Компилятор не находт конфликтов и всё компилируется. С синтаксической точки зрения всё правильно, семантику именам методов придаёт только программист.
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
14.12.2011, 23:30  [ТС] #18
silent_1991, ну как-то это всё для меня странно. Ладно, попробую поработать так, авось выгорит.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.12.2011, 23:34 #19
kravam, что странного-то? Это не более странно, чем метод push_back в векторе и метод push_back в списке. Они никак не связаны, просто называются одинаково. Как вектор, так и список - контейнеры, как в одном, так и в другом есть метод добавления элемента в конец. Так назовите хоть одну причину не назвать эти методы одинаково и там, и там?
0
14.12.2011, 23:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 23:34

рабочая программа. но нужно ее переписать так, чтобы она была наиболее общей.
Задана матрица смежности размерности N*M. С помощью процедуры и матрицы меньшей...

Как сделать так, чтобы программа понимала русские буквы?
И если знаете как убрать этот огромный массив символов &quot;char mass2&quot; на chr...

Как сделать так чтобы программа открывала txt файл?
Допустим,я создал тхт файл и нужно его открыть с помощью запуска программы,как...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

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