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

Возможно ли это на с++? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 19:46     Возможно ли это на с++? #1
Допустим есть класс
Код
class MyBool{
int data;
//Читаем бит номер num
bool GetVal(num){return data&(1<<num);}
//Записываем в бит номер num значение val
void SetVal(num,val){val?data|=(1<<num):data&=~(1<<num);}
};
т.е. определены побитовое хранение булевых значений, их чтение и запись.
А теперь вопрос: Существует ли способ определить операторы так, чтобы работал следующий код:
Код
MyBool a;
if(a[0])
    a[1]=true;
Соответственно a[0] делает GetVal(0), a[1]=true делает SetVal(1,true)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2011, 19:46     Возможно ли это на с++?
Посмотрите здесь:

C++ Структура в классе, это возможно?
C++ как можно сделать это? если вообще возможно (не задача)
C++ Доступ к данным в *.mdb посредством OLE DB -- это возможно?
C++ _TCHAR szTestString[] = как сделать тут ввод с клавиатуры и возможно ли это
Возможно ли это заменить циклом? C++
C++ Доступ к переменной только из двух функций. Возможно ли это?
Как это возможно сделать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1010 / 789 / 46
Регистрация: 30.04.2011
Сообщений: 1,598
08.08.2011, 14:26     Возможно ли это на с++? #41
Цитата Сообщение от Teravisor Посмотреть сообщение
Или я вас не понял, или я этого не знал. Где почитать можно в надежных источниках, чтобы определиться? Если ссылка на стандарт, то пункт в нем, пожалуйста, а то он большой.

Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
1. В стандарте ни слова по этому поводу нет. Это уже особенности реализации оси и платформы. Если вы работаете в винде, то по умолчанию винда выделяет под стек (то есть под все локальные переменные) стек размером 1 метр. Локальный массив - это такая же локальная переменная, как и все остальные, поэтому размещается в стеке. В то время как глобальный массив размещается с static storage и занимает столько места, сколько нужно. Аналогично динамический размещается в куче и занимает столько места, сколько нужно. В обоих случаях используется виртуальная память.
Про никсы не скажу - не работал. Но про стек должно быть так же.
2. Вам ничто не мешает иметь доступ к элементу вектора по указателю:
C++
1
2
vector<int> v(N);
int *p = &v[0];
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
08.08.2011, 19:02     Возможно ли это на с++? #42
Цитата Сообщение от Kastaneda Посмотреть сообщение
вот быдлокод:
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
27
28
29
30
31
32
33
34
35
36
37
class MyBool{
int data;
unsigned last_mask;
public:
    MyBool(int d=0):data(d),last_mask(0){}
 
    MyBool& operator[](int num){
        last_mask=1<<num;
        return *this;
    }
 
    void operator=(bool b){
        data=(b ? data|last_mask : data&(~last_mask));
    }
 
    operator bool(){
        return data&last_mask;
    }
    friend std::ostream& operator<<(std::ostream &os,MyBool ob){
        return os<<std::hex<<ob.data;
    }
};
 
 
 
int main(){
    MyBool mb;
    std::cout<<mb<<std::endl;
    mb[0]=true;
    mb[1]=true;
    mb[2]=true;
    std::cout<<mb<<std::endl;
    if(mb[0])
        std::cout<<"mb[0] = true"<<std::endl;
    else std::cout<<"mb[0]=false"<<std::endl;
    return 0;
}
Может кто-нибудь красивее сделает?
Класс написан очень плохо. Во-первых, он совершенно не работает для константных объектов. Во-вторых, в нем нарушена семантика оператора присваивания, когда вместо ссылки на класс возвращается void. В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
grizlik78
Эксперт С++
 Аватар для grizlik78
1887 / 1419 / 103
Регистрация: 29.05.2011
Сообщений: 2,967
08.08.2011, 19:07     Возможно ли это на с++? #43
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект.
Ты про operator<<? Смотрел, смотрел, но так и не понял, о какой "неконстантной ссылке" ты говоришь. MyBool там по значению передаётся.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.08.2011, 19:20     Возможно ли это на с++? #44
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
вы не поверите, но даже в случае константной ссылки ничего нельзя уверенно сказать про объект
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4247 / 2779 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
08.08.2011, 19:46     Возможно ли это на с++? #45
Цитата Сообщение от Сыроежка Посмотреть сообщение
Класс написан очень плохо. Во-первых...
Я ж говорю - быдлокод. Вопрос был "возможно ли это на С++", я показал, что возможно, и не более того.
Сыроежка
Заблокирован
08.08.2011, 19:52     Возможно ли это на с++? #46
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ты про operator<<? Смотрел, смотрел, но так и не понял, о какой "неконстантной ссылке" ты говоришь. MyBool там по значению передаётся.
Я привык, что оператор вывода использует объекты по ссылке, а не по значению, поэтому особенно не всматривался в объявление. Но в людбом случае возникает вопрос, почему объект передается по значению, а не по константной ссылке?
grizlik78
08.08.2011, 19:57
  #47

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
Я привык, что оператор вывода использует объекты по ссылке, а не по значению, поэтому особенно не всматривался в объявление.
Я привык, что адекватные критики всё-таки всматриваются в то, что они критикуют
Цитата Сообщение от Сыроежка Посмотреть сообщение
Но в людбом случае возникает вопрос, почему объект передается по значению, а не по константной ссылке?
Потому, что автору не обещали оплаты

Сыроежка
Заблокирован
08.08.2011, 19:58     Возможно ли это на с++? #48
Цитата Сообщение от alex_x_x Посмотреть сообщение
вы не поверите, но даже в случае константной ссылки ничего нельзя уверенно сказать про объект
Выаблуждаетесь! В противном случае весь существующий код некорректный. Вы просто путатете две вещи: первое - это то, что кто-то может писать некорректный код, и отчего никто не застрахован, и второе - соглашение об интерфейсе между программистами. Если вы следуете соглашениям об интерфейсе, то вы полагаетесь на то, что объект не будет изменен.
LosAngeles
Заблокирован
08.08.2011, 20:03     Возможно ли это на с++? #49
Цитата Сообщение от Сыроежка Посмотреть сообщение
Выаблуждаетесь! В противном случае весь существующий код некорректный. Вы просто путатете две вещи: первое - это то, что кто-то может писать некорректный код, и отчего никто не застрахован, и второе - соглашение об интерфейсе между программистами. Если вы следуете соглашениям об интерфейсе, то вы полагаетесь на то, что объект не будет изменен.
C++
1
friend std::ostream& operator<<(std::ostream &os,MyBool& ob)
C++
1
friend std::ostream& operator<<(std::ostream &os,const MyBoo&l ob)
в обоих случаях используется константная ссылка, но в первом случае нельзя сказать что объект не будет изменён

Добавлено через 1 минуту
константная ссылка как гритца не панацея, ссылка на константу - другое дело
grizlik78
08.08.2011, 20:09
  #50

Не по теме:

Цитата Сообщение от LosAngeles Посмотреть сообщение
константная ссылка как гритца не панацея, ссылка на константу - другое дело
Вопрос о корректности термина "константная ссылка" я бы предложил обсуждать в разделе "Священные войны". Надоело уже видеть это здесь.
Сыроежка говорил про другое, хотя наш кэп стареет

Сыроежка
Заблокирован
08.08.2011, 20:16     Возможно ли это на с++? #51
Цитата Сообщение от LosAngeles Посмотреть сообщение
C++
1
friend std::ostream& operator<<(std::ostream &os,MyBool& ob)
C++
1
friend std::ostream& operator<<(std::ostream &os,const MyBoo&l ob)
в обоих случаях используется константная ссылка, но в первом случае нельзя сказать что объект не будет изменён

Добавлено через 1 минуту
константная ссылка как гритца не панацея, ссылка на константу - другое дело
Знаете, это вы не по адресу обратились! Это уже вопрос относительно вашим знанй. Едли бы вы читали стандроат, то бы знали, что в нем испольбзуется термин "константная ссылка", и все понимают, что под тэтим имеется в виду. А так как вы стандларт не читали, то у вас и возникает такая путаница.
LosAngeles
Заблокирован
08.08.2011, 20:33     Возможно ли это на с++? #52
Цитата Сообщение от Сыроежка Посмотреть сообщение
Едли бы вы читали стандроат
если б ты учил в школе русский, то наверняка бы знал, что в фразе "константная ссылка на объект" прилагательное "константная" относится к ссылке, а не объекту

а то что люди пишущие стандарт не в ладах с английским или экономят бумагу для меня не аргумент
Сыроежка
Заблокирован
08.08.2011, 20:45     Возможно ли это на с++? #53
Цитата Сообщение от LosAngeles Посмотреть сообщение
если б ты учил в школе русский, то наверняка бы знал, что в фразе "константная ссылка на объект" прилагательное "константная" относится к ссылке, а не объекту

а то что люди пишущие стандарт не в ладах с английским или экономят бумагу для меня не аргумент
Как сказал один киногерой, я люблюд умных людей, но не тлюблю умников. Я вам еще раз повторяю, вмесвто того, чтобы умничать, вы бы лучше заглянули в стандарт языка С++, и ознакомилдись бы с тем, что там используются термины const reference и non-const reference.

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

Вы считаете себя всех умнее. Мне же в голову прихоидт поговорка: /"дуракам закон не писан/".

Добавлено через 2 минуты
Цитата Сообщение от LosAngeles Посмотреть сообщение
если б ты учил в школе русский, то наверняка бы знал, что в фразе "константная ссылка на объект" прилагательное "константная" относится к ссылке, а не объекту

а то что люди пишущие стандарт не в ладах с английским или экономят бумагу для меня не аргумент
Как сказал один киногерой, я люблюд умных людей, но не тлюблю умников. Я вам еще раз повторяю, вмесвто того, чтобы умничать, вы бы лучше заглянули в стандарт языка С++, и ознакомилдись бы с тем, что там используются термины const reference и non-const reference.

Вы можете и дальше графомански рассуждать, но что касается меня, то я придерживаюсь тех терминов, которые используются в станларте. И те, кто писал стандарт, хорошо понимают, о чем идет речь, когда используются эти термины.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.08.2011, 22:11     Возможно ли это на с++? #54
Цитата Сообщение от Сыроежка Посмотреть сообщение
Выаблуждаетесь! В противном случае весь существующий код некорректный. Вы просто путатете две вещи: первое - это то, что кто-то может писать некорректный код, и отчего никто не застрахован, и второе - соглашение об интерфейсе между программистами. Если вы следуете соглашениям об интерфейсе, то вы полагаетесь на то, что объект не будет изменен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int f( const int& a )
{
   return const_cast<int&>( a ) = 123;
}
 
int main()
{
   int a = 100;
   f( a ); 
   printf( "%d\n", a );
   return 0;
}
код корректен...
и здесь даже гарантировано define behavior
Сыроежка
Заблокирован
09.08.2011, 01:55     Возможно ли это на с++? #55
Цитата Сообщение от alex_x_x Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
int f( const int& a )
{
   return const_cast<int&>( a ) = 123;
}
 
int main()
{
   int a = 100;
   f( a ); 
   printf( "%d\n", a );
   return 0;
}
код корректен...
и здесь даже гарантировано define behavior
Еще Страустроп сказал, правда в более мягкой форме, что у С++ нет защиты от дураков! Если вы объявляете интерфейс, что в функцию передается константная ссылка на объект, то вы несете полную ответсвеннось, как говорится, за "свой базар". Интерфейс - это ваш договор между вами и пользователем вашей функции. И ни вы, ни пользователь вашей функции не должны нарушать этот договор. Вы в своем ответе привели мою цитату, но совершенно не поняли, что я там сказал! Порой создается впечатление, что иногда ведется диалог с неадекватными людьми, которые не в состоянии понять простые вещи, которые им говорят.

Я вам еще раз повторяю, если с первого раза до вас не доходит, что если бы люди не следовали соглашениям, весь написанный код на С++ был бы некорректным! Вы не могли бы использовать ни одной стандартной функции, так как никто бы вам не давал гарантию, что константные данные в ней не изменятся. Поэтому еще раз перечитайте мое предыдущее сообщение, прежде чем что-то мне в ответ писать. В нем все сказано.
alex_x_x
09.08.2011, 02:28
  #56

Не по теме:

Сыроежка, вы правда думаете что сказали что-то новое и необычное?
Смотрите, повторится история как с другими форумами

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2011, 08:39     Возможно ли это на с++?
Еще ссылки по теме:

C++ Partition для map. Возможно ли это?
C++ Выскакивают ошибки конвертации одного типа в другой, как возможно это исправить?
C++ Как записать в вектор структуру? Это вообще возможно сделать?
Рекурсивная программа. Составить пары из группы, если это возможно C++
C++ Заменить оператор goto на цикл, если это возможно

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
09.08.2011, 08:39     Возможно ли это на с++?
  #57

Не по теме:


Сыроежка, тебя кто в детстве обидел?! Не первый раз замечаю, что ты регулярно переходишь на оценку личности вместо конкретной оценки кода со ссылкой на стандарт. Причем оценка у тебя постоянно одинаковая: собеседник ничего не знает, и потому дурак.

Yandex
Объявления
09.08.2011, 08:39     Возможно ли это на с++?
Ответ Создать тему
Опции темы

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