Вопрос по C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by enk, 30 May 2011.

  1. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Прочитал я тут пару статей об устройстве объектной модели C++, и мне стало интересно, можно ли записывать данные в приватные поля класса. Я сразу же написал такой код:
    Code:
    class A
    {
    public:
    	int a;
    private:
    	int b;
    };
    
    void PrintClassMembersInt(void* Object, int size ,bool vTable = false)
    {
    	for(int i = (vTable ? sizeof(int*) : 0);i < size / 4; ++i)
    	{
    		printf("%d\n", reinterpret_cast<int*>(Object)[i]);
    	}
    }
    
    void WriteClassMemberInt(void* Object, int offset, int Value, bool vTable = false)
    {
    	reinterpret_cast<int*>(Object)[offset] = Value;
    }
    
    int main()
    {
    	A obj;
    	obj.a = 103;
    
    	WriteClassMemberInt(&obj, 1, 25555);
    	PrintClassMembersInt(&obj, sizeof obj);
    
    	getchar();
    	return 0;
    }
    
    Вопрос: для чего нужны приватные поля класса, если в них так просто записать нужные тебе данные?! Сорри если ответ банален, я всего лишь новичок с бардаком в голове...
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Я в сишном синтаксисе не очень шарю, но ты пишешь в поле А, а оно у тебя обьявлено как паблик. Ты в поле B попробуй записать!
     
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Такие вопросы автоматически делают тебя либо знатным извращенцем, либо неопытным троллем.

    В конце-концов, ты же можешь открыть код и просто перенести нужные поля в public-секцию! Действительно, зачем нужны эти private-поля!

    А еще можно переписать всю память программы нулями, и тогда она упадет! Зачем C++ предоставляет такую возможность, если можно так просто убить программу?!! Зачем все эти функции, переменные, если всё так просто переписывается???


    Он анально записал в поле B.
     
  4. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Прочитай внимательнее код.
     
  5. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    По этому посту троллингом занимаюсь точно не я. Мне просто интересно, как устроена объектная модель C++. Я пишу такие извращенные коды, чтобы понять как он работает.
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Ну, если не троллингом, то ты точно извращенец. Я привел парочку вопросов, схожих с твоим. Наверное, стоит понимать, что вся эта модель сделана для адекватных людей.
    Да и что ты хотел? Неведомое расположение приватных полей по хитрым смещениям, чтобы ты даже через жопу их найти не смог? Или некий запрет на запись в них каким-то образом, приводящий к краху программы? Вдумайся и пойми обсурдность того, что ты делаешь.
     
  7. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Я уже писал выше, что делаю это в сугубо образовательных целях. Я не старый программист-задрот который знает все и вся, сорри уж...
     
  8. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    В образовательных целях делаются вещи в пределах разумного, пожалуй. А подобные твоему эксперименты скорее всего ничему не научат. Дети, в образовательных целях тыкающие пальцы в розетку, обычно потом уже не образовываются.
    А если не нравится типизация и запреты C++ - добро пожаловать в asm (или на крайняк Си) - там всё можно.
     
  9. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    При чем тут это? Мне просто кажется, что при попытке записи в приватное поле, как минимум должно выбрасываться исключение, или программа должна аварийно завершаться...
     
    1 person likes this.
  10. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    На уровне адекватного использования компилятора это контролируется (затычка в розетку). Но почему компилятор должен такое контролировать, если ты сам с помощью reinterpret_cast и смещений записываешь в обычную память программы свое значение? Программа, по-твоему, должна регулярно просчитывать свои контрольные суммы, или ставить точки останова на области памяти приватных полей, и следить за такой неадекватной активностью? Ты выколупываешь затычку вилкой и все равно суешь пальцы, получая 220. Ай-ай-ай, розетка не проконтролировала сие деяние и убила неосторожного экспериментатора, как же так, ведь должен был вырубиться свет во всем доме...
     
  11. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Ок, спасибо за развернутый ответ.