2017-02-19 5 views
0

У меня есть класс, который содержит частный указатель на struct (это управляемый C++ и структура является родной). Объект, на который указывает этот указатель, в основном создается в конструкторе и живет до тех пор, пока не будет уничтожен содержащийся класс. Нет кода, который переназначает указатель на другой объект, когда он назначен в конструкторе Foo, и я не предполагаю, что в будущем они появятся.Предположения при доступе к частному указателю-члену внутри класса

Меня не интересуют ответы, относящиеся к использованию интеллектуальных указателей, поскольку я работаю с большим количеством необработанных указателей в некотором устаревшем коде. Портирование всего - это другой вопрос и что-то, что планируется.

Мои вопросы:

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

  2. Если у меня есть несколько частных функций, которые используют класс ... должен ли я всегда проверять на наличие nullptr до разыменования в этих функциях, или могу ли я предположить, что указатель указывает на действительный объект, заданный способом построения класса (Если бы это был родной C++, я бы просто сделал указатель фактическим объектом, чтобы это ушло)?

  3. Любые лучшие способы сделать это, не связанные с созданием другой управляемой обертки для SomeStructType или умных указателей?

    public ref class Foo 
    {   
        private: 
    
        SomeStructType* pMyStruct;   
    
        void Initialize() 
        { 
         pMyStruct = new SomeStructType(); 
        } 
    
        void DoSomethingElse1(); //Uses pMyStruct 
        void DoSomethingElse2(); //Uses pMyStruct 
    
        public: 
    
        void DoSomething(); //Uses pMyStruct or calls private func that does 
    
        Foo() 
        { 
         Initialize(); 
        } 
    
        ~Foo() 
        { 
         delete pMyStruct; 
        } 
    } 
    
+0

Рекомендовать переформулировку «Не должно быть экземпляров, когда указатель переназначается без создания другого экземпляра класса», потому что я могу прочитать три разных способа, и, возможно, все они ошибочны. – user4581301

+0

Я не знаю моих управляемых расширений C++, но в Plain Jane C++ ваш пример быстро запустит [Правило трех] (http://stackoverflow.com/questions/4172722/what-is-the-ru- из-три). – user4581301

+0

@ user4581301 1. Я согласен с комментарием «Правило трех». У меня не так много (в том, как я собираюсь реорганизовать класс), но 2. Я переформулировал это предложение. На самом деле я просто говорю, что указатель назначается в конструкторе и удаляется в деструкторе. Никаких планов ни на что другое, кроме доступа к объекту, на который он указывает. – user2079828

ответ

0

Нет, вам не нужно, чтобы проверить его каждый раз, так как договора (и правила C++) означает, что объект всегда будет существовать в любой момент вы могли бы попытаться получить к нему доступ в действительный способ.

Если его можно переназначить, и вы находитесь в многопоточной среде, вы, вероятно, захотите заблокировать доступ к нему. Это будет единственная проблема, о которой я могу думать.

+0

Можете ли вы объяснить, что вы подразумеваете под «правилами C++». Я предполагаю, что вы имеете в виду, что, поскольку указатель указывает на объект, который существует для жизни класса, мне не нужно беспокоиться об этом? Нет необходимости в замках, так как это будет использоваться только в одном потоке. – user2079828

Смежные вопросы