Класс с атрибутами, ссылающимися на внешнюю переменную, только в некоторых случаях

У меня есть class, где в конкретном случае некоторые его атрибуты должны ссылаться на внешнюю переменную. Мне удалось это сделать, но есть ли лучший способ?

#include "Vector.h" class LineSeg { private: Vector* a; Vector* b; bool owns; public: LineSeg(){ a = new Vector(); b = new Vector(); owns = true; } LineSeg(Vector ap, Vector bp){ a = new Vector(ap); b = new Vector(bp); owns = true; } LineSeg(Vector &ap, Vector &bp, bool owns){ a = ≈ b = &bp; owns = false; } virtual ~LineSeg(){ if(owns){ delete a; delete b; } } }; 

Я не могу сделать два разных classа.

Когда вы делаете такие вещи (иногда это происходит специально для мьютексов), я обычно использую указатель на членов. Это позволяет избежать любого специального лечения и delete в деструкторе.

 #include "Vector.h" class LineSeg { private: Vector a0; Vector b0; Vector* a = &a0; Vector* b = &b0; public: LineSeg() { } LineSeg(Vector &ap, Vector &bp, bool copy) { if( copy ) { a0 = ap; b0 = bp; return; } a = ≈ b = &bp; } virtual ~LineSeg(){ } }; 

Однако это связано с некоторой стоимостью памяти при использовании внешних ссылок, поскольку a0 и b0 все еще используют пространство в classе, хотя и не используются. Однако такая конструкция необходима редко, и это стоит небольшая стоимость памяти imo.

Но конструктивно эта конструкция сомнительна, потому что она потенциально запутанна и опасна. Допустим, вы добавили метод clear() , который очищает оба элемента Vector :

 void clear() { a->clear(); b->clear(); } 

Теперь коллега создает LineSeg( myVector1, myVector2, false) и после некоторых вычислительных вызовов myLineSeg.clear() – это может быть довольно запутанным, потому что его собственные myVector1 и myVector2 очищаются.

Вот почему я ограничиваю это особыми случаями, такими как мьютексы, и обычно только защищаю их.

Im большинств другие случаи vu1p3n0x правы – гораздо лучше использовать только один механизм – либо всегда копировать, всегда владеть собственностью, либо использовать shared_ptr .