2013-07-18 2 views
0

Я рефакторинг класса для моего проекта для адаптации данных int. Код достаточно сложен, попробуйте дать простой пример ниже:Можно ли преобразовать указатель в мой класс?

struct A { 
    A(int a):a_(a) {} // Supports implicit conversion from int 
    int a_; 
}; 

void print(A a) { cout<<a.a_<<endl; } 

void x2(A *a) { // change a's value 
    a->a_ *= 2; 
} 

int main() { 
    int b = 2; 
    print(b);  // pass int as A without any problem 
    x2(&b);  // pass int* as A* - failed 
    cout<<b<<endl; // b is supposed to changed by x2() 
} 

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

Есть ли другой способ использования «int *» как «A *»?

+1

Я думаю, что лечение 'INT *' как '' A * будет d o гораздо больший вред, как для читаемости, так и для правильности вашего кода, чем шаблоны. Если вы действительно хотите, вы можете сделать A A (42); x2 (&a); '. – jrok

ответ

2

Нет, нет «пути». То, что вы пытаетесь сделать здесь, нарушает договор на x2, который является то, что a будет действительным указателем на A.

Самое простое изменение к нему было бы изменить x2 на: (Там действительно нет необходимости использовать указатель здесь)

void x2 (A& a) { 
    a.a_ *= 2; 
} 

А затем вызвать его со значением, которая обернута вокруг междунар (например, @ Джрок предложил):

A a(2); 
x2(a); 

Если вы conderned с печатью, обеспечивают operator<< для А.

+0

После изменения x2 как void x2 (A & a) вы также можете добавить ссылки на ваш struct ctor и member. Таким образом, вы можете вызвать x2 как: {int b = 12; x2 (A (b));} Просто создайте объект, когда это необходимо. – jujujuijk

+0

@jujujuijk в прошлый раз, когда я проверил rvalue, не будет работать вместо not-const lvalue. –

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