Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

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

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

Author24 — интернет-сервис помощи студентам
Друзья! Дело в следующем, вот у меня есть функции X и Y. И вот мне не хотелось бы вызывать X прежде, чем будет вызвана Y. Но это всё в пользовательском классе реализовано, которым возможно будут пользоваться другие люди вот они по запарке могут ошибиться и сперва вызвать Y, а потом X. Да и я могу также сделать. Короче как сделать защиту от дураков такого рода? Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2011, 07:44
Ответы с готовыми решениями:

Как сделать так, чтобы форма не была за панелью задач?
Как сделать так, чтобы форма не была за панелью задач? Использовал свойство...

Как сделать так, чтобы первая строка была такой:
как сделать так, чтобы результат был как в Qbasic. uses Crt; var n, I, p: integer; S:...

GLUT, как сделать так, чтобы была анимация дрожания у слов?
Сделал, слова, и надо сделать так, чтобы они дрожали, но не знаю как :с #include <Windows.h>...

Как сделать так, чтобы у меня в экране 1,0 не была на весь экран?
Может кто читал мою тему снять ограничение. Поставлю вопрос по другому. Как сделать так чтобы у...

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

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

Не по теме:

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

1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.12.2011, 22:01 9
kravam, не совсем понятно, что сложного в увеличении вектора индексов при добавлении значений? Определяем для структуры push_back, тогда не придётся лезть в её внутренности, а внутри этого пуш_бэка добавляем переданный ему элемент в вектор значений, и вектор индексов увеличиваем. Так будет куда лучше.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
14.12.2011, 22:14  [ТС] 10
Так я так и сделал один к одному, я определил эту функцию
push_back_
И дальше согласно тык сктыть инструкциям

Но мне не хочется использовать определённую МНОЙ push_back_, я же говорю, хочется обойтись стандартным push_back, а ошибки отслеживать через сообщения компилятора
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.12.2011, 22:19 11
kravam, во-первых, почему push_back_, а не push_back? Любите выделяться и не сохранять общность? Во-вторых, почему вы так не хотите использовать собственную функцию, если это будет куда более правильным, чем лезть внутрь структуры и доставать пушбэк оттуда? Одна лишняя операция адресации, несколько лишних символов. Ну и в-третьих, я уже сказал, вы никак не сможете повлиять на компилятор и заставить его выдать ошибку в абсолютно правильном коде. Какую ошибку вы вообще намеревались получить?
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
14.12.2011, 22:33  [ТС] 12
Начну с конца. Так-то хотелось бы получить сообщение "функция Y вызвана после функции X".
На худой конец сошло бы ЛЮБОЕ сообщение, лишь бы оно было вызвано именно этой проблемой. Да, и чтобы номер строки в сообщении был. Тгда бы я уж разобрался что к чему.

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

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

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

Но насколько это грамотно с технической точки зрения? Может быть я просто обманул компилятор?
(Сам по мебе обман компилятора для меня приемлем, если я ЗНАЮ, что делаю) А тут всё внове, не могу себе представить последствий такого шага. Чё-то я упустил в обучении такой момент как переопрееление стандартных функций, не всречал нигде.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.12.2011, 23:24 16
Вообще сам подход какой-то кривой.
Если например ф-ия принимает указатель на что-то, но не работает с нулевыми указателями - компилятор никак не заставишь выдать ошибку, которая только в рантайме может возникнуть. Тут или тип аргумента надо менять (например на ссылку в случае с указателями), или свойства типа (хитрый интерфейс у типа, который как параметр передается, чтобы затруднить пользователям такой ф-ии наступить себе на яйца), или же ф-ия должна проверять агрументы на предмет их валидности и как-то осознано реагировать на невалидные агрументы, а не разваливаться на пол пути своего выполнения. То же самое и с векторами этими. Кидайте неуловимые исключения чтоли. В дебаге это без проблем ловится и клиенты класса не останутся с неисправленным кодом.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.12.2011, 23:26 17
kravam, да ничего вы не переопределили. У вас структура наследник вектора? Нет. Так почему вы думаете, что что-то переопределили? Вы просто определили метод с именем push_back для своей структуры. Компилятор не находт конфликтов и всё компилируется. С синтаксической точки зрения всё правильно, семантику именам методов придаёт только программист.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
14.12.2011, 23:30  [ТС] 18
silent_1991, ну как-то это всё для меня странно. Ладно, попробую поработать так, авось выгорит.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.12.2011, 23:34 19
kravam, что странного-то? Это не более странно, чем метод push_back в векторе и метод push_back в списке. Они никак не связаны, просто называются одинаково. Как вектор, так и список - контейнеры, как в одном, так и в другом есть метод добавления элемента в конец. Так назовите хоть одну причину не назвать эти методы одинаково и там, и там?
0
14.12.2011, 23:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2011, 23:34
Помогаю со студенческими работами здесь

Как сделать так, чтобы форма всегда была под фокусом
Как сделать так, чтобы форма всегда была под фокусом.

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

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

Как сделать чтобы программа не была в панель задач
Здравствуйте, как сделать так чтобы программа была видима но чтобы в панеле задач она...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru