2013-10-03 4 views
0

я работаю над проектом, СРР, который имеет несколько глобальных переменных, например:Рефакторинг глобальные экземпляры на указатели

class A; 
class B; 
A a; 
B b; 

Я хочу, чтобы иметь возможность переключения между различными значениями а и Ь. В идеале не должно было быть глобальными переменными вообще, или они должны были быть указателями , чтобы мы могли легко переключаться. Например. Если у нас есть:

B* b; A* a; 

то мы можем изменить a и b во время выполнения. Однако, проблема заключается в том, что переменные а и Ь называются сотни раз в проекте, и я должен был бы изменить все эти строки из

a.something 

в

a->something 

, которые могли бы принять какое-то время. Есть ли более быстрый способ сделать это?

+0

я не вижу очевидный способ, в котором ссылки будет полезно - как только вы инициализировать ссылку, вы не можете «повторно -seat ", чтобы ссылаться на другой объект. –

+0

Теоретически вы можете добавить ссылки на списки параметров каждой функции, которая использует эти глобальные переменные (и списки параметров каждой функции выше тех, которые находятся в дереве вызовов), и потопить ваши глобальные значения через программу со ссылками. Получает избавление от глобальных переменных и сохраняет синтаксис '.', За счет изменения множества сигнатур функций. –

+1

Есть ли более быстрый способ выполнить глобальный поиск и заменить? Um. что-то не так с выполнением глобального поиска и замены? – WhozCraig

ответ

0
# clean checkout from version control 
find . -name *.c -exec perl -i -pe 's/\<a\.(\w+)/a->\1/g' \{} \; 
# review changes, fix the places the regex got wrong 
+0

Произошла подобная вещь, теперь она отлично работает. Благодарю. –

0

В зависимости от того, насколько сложным А ...

#include <iostream> 

struct A { 
    virtual void print() { std::cout << "A\n"; } 
}; 

struct D : public A { 
    virtual void print() { std::cout << "D\n"; } 
}; 

struct Ref { 
    void set(A* obj) { o = obj; } 
    void print() { o->print(); } 
    A* o; 
}; 

Ref a; 

int main() { 
    a.set(new A()); 
    a.print(); 
    // switch a 
    a.set(new D()); 
    a.print(); 
} 
+0

Это слишком много работы, так как A действительно сложно. Делал поиск и замену, работал отлично. Благодарю. –

+0

@turing_machine, Хорошо. Фиксирование, а не склеивание - это лучшее решение в долгосрочной перспективе. –

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