Как перегрузить оператор = вернуть указатель на член? - PullRequest
1 голос
/ 21 февраля 2012

Имея что-то вроде следующего кода (упрощенно):

struct MyStruct {
    int member1;
    int member2;
};

class MyClass { 
    MyStruct *data;
}


MyClass obj;

// put obj.data in pstruct  
// so obj.data->element1 is the same as pstruct->element1
MyStruct *pstruct = obj;

Я не хочу создавать копию obj.data, но возвращаю тот же указатель, поэтому, если я внесу изменение в pstruct->member1, то изменение будет таким же в obj.data->element1 (и наоборот).

Возможно ли это?

Спасибо

Ответы [ 4 ]

7 голосов
/ 21 февраля 2012

Звучит так, будто вам нужен оператор преобразования, который создает MyStruct* из MyClass:

class MyClass {
    MyStruct *data;
public:
    operator MyStruct*() {
       return data;
    }
};
2 голосов
/ 21 февраля 2012

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

MyClass obj;
MyStruct *pstruct = obj.data; // Assuming that `data` is accessible here

Если у вас нет доступа к внутреннему члену data, вам необходимо либо предоставить доступ (функция-член, которая возвращает указатель --breaks encapsulation), либо сделать вызывающий код friend из MyClass для предоставления доступа к внутреннему типу (все еще нарушает инкапсуляцию, чуть меньше).

2 голосов
/ 21 февраля 2012

Нет проблем.

MyClass obj;

MyStruct *pstruct = obj.data;
1 голос
/ 21 февраля 2012

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

class MyClass {
private:
    MyStruct *data;
public:
    MyStruct* GetData() const { return data; }
};


int main () {
  MyClass obj;
  MyStruct *pstruct = obj.GetData();
  MyStruct *pstruct2;
  pstruct = obj.GetData();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...