Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

symfonia c++ Operator const_cast

Ostatnio zmodyfikowano 2014-01-13 21:24
Autor Wiadomość
sic0
Temat założony przez niniejszego użytkownika
symfonia c++ Operator const_cast
» 2014-01-12 13:59:19
Witam.
Jestem w trakcie nauki języka C++ przy pomocy książki Symfonia C++ standard Kraków 2008. Obecnie jestem na stronie 281 gdzie znajduje się przykład dotyczący rzutowania przy pomocy operatora const_cast. Wg. opisu autora owy operator powinien dać możliwość modyfikacji obiektu stałego niestety nie udało mi się to pomimo przepisania przykładu z książki. Po kilku próbach i nawet kilkunastu własnych modyfikacjach kody nadal nie udało mi się osiągnąć zamierzonego celu. Odnalazłem zatem już napisane przykłady do owej książki w którym również nie został zmodyfikowany obiekt stały. Pozwolę sobie wkleić tutaj kod:

C/C++
#include <iostream>
using namespace std;

int main()
{
    double zmienna = 0;
    const double stala = 3.14;
   
    double * wsk_do_zmiennej = & zmienna;
    const double * wsk_do_stalej = & stala;
    const double * wsk2_do_stalej;
   
    cout << "Na poczatku, stala = " << stala << endl;
   
    wsk2_do_stalej = wsk_do_zmiennej;
   
    //wsk_do_zmiennej = wsk_do_stalej;
    wsk_do_zmiennej = const_cast < double *>( wsk_do_stalej );
   
    * wsk_do_zmiennej = - 333;
    cout << "Potem =====> stala = " << stala << endl;
   
    double * const st_wsk_do_zmiennej =
    const_cast < double * const >( wsk_do_stalej );
   
    wsk_do_zmiennej = st_wsk_do_zmiennej;
   
    int * wskint;
    wskint = reinterpret_cast < int *>( const_cast < double *>( wsk_do_stalej ) );
}

Wynik powinien wyglądać tak:
Na poczatku, stala = 3.14
Potem =====> stala = -333

Moje pytania/prośby brzmią:
1) Czy w obecnej wersji standardów języka C++ nastąpiły zmiany które uniemożliwiają taką zmianę?
2) Czy jest możliwość wykonania tego w jakiś inny sposób?
3) Jeżeli wszystko jest ok tylko popełniłem jakiś błąd bądź w książce jest błąd prosiłbym o wskazanie mi go.

Używam: Code::Block wersja 13.12, Windows 7 64bit.
Z góry dziękuje za odpowiedź.
P-101933
Monika90
» 2014-01-12 14:15:04
Operator const_cast nie pozwala na modyfikowanie stałej, nigdy na to nie pozwalał i w ogóle nie da się tego zrobić - tzn. przy próbie zrobienia czegoś takiego zachowanie programu jest niezdefiniowane.
P-101935
leon_w
» 2014-01-12 16:19:26
Autor napisał:
"No, nie zawsze. Standard mówi, że taka prośba modyfikacji obiektu stałego ma "zachowanie niezdefiniowane". Dla naszego dobra niektóre kompilatory generują w tym miejscu taki kod, który mimo wszystko  zachowa poprzednią wartość tego stałego obiektu. Chwała im za to.
P-101979
sic0
Temat założony przez niniejszego użytkownika
kompilator
» 2014-01-12 16:46:32
Przyznam, że umkneło to zdanie mojej uwadze, a czy znany jest Tobie/Wam kompilator który taką "transformację" zaakceptuje?
P-101986
Chlorek
» 2014-01-12 19:17:21
Tylko po co to robić? Rozumiem, że to w formie nauki, ale nigdy i tak w żadnym programie (poza czysto testowym) czegoś takiego nie wolno robić. Const to const i tak powinno zostać.
P-102009
pekfos
» 2014-01-12 20:44:41
a czy znany jest Tobie/Wam kompilator który taką "transformację" zaakceptuje?
Nie wolno i tyle. Zabronione pod karą niedziałania programu. Jak usłyszałeś w szkole, że nie można dzielić przez zero, to też zadałeś podobne pytanie?
P-102016
sic0
Temat założony przez niniejszego użytkownika
» 2014-01-13 20:27:51
Dzięki za zainteresowanie i odpowiedzi, po co? z ciekawości, ale jeżeli tego się nie praktykuje to nienalegam.
P-102112
Elaine
» 2014-01-13 21:24:22
Jak usłyszałeś w szkole, że nie można dzielić przez zero, to też zadałeś podobne pytanie?
Różnica jest taka, że dzielić przez zero czasami można.
P-102120
« 1 »
  Strona 1 z 1