2016-08-18 5 views
0

Я ищу несколько советов о том, как организовать мой код на C++.Организация кода C++

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

Я подумал о следующей структуре, чтобы макет такой проблемы.

Я сохраняю глобальный указатель внутри, который я затем могу использовать, чтобы указать на адрес моего массива int, а затем использовать указатель * side внутри foo для внесения изменений.

Просьба сообщить вам, пожалуйста, о компоновке и организации этого кода? Я совершенно новичок в C++, поэтому буду признателен за любые советы по нижерасположенной структуре.

#include <iostream> 
#include <vector> 

using namespace std; 

int *side; 

class A { 
    public: 
     int foo(bool); 
     int bar(vector<int>); 
     void set_n(int n){ class_n = n;}; 
    private: 
     int class_n; 
}; 

int A::foo(bool fl) 
{ 
    int n = class_n; 
    for(int i = 0; i < n; i++) { 
     // modify side[] and then recursively call foo 
    } 

    return 0; 
} 

int A::bar(vector<int> t) 
{ 
    int size = t.size(); 
    set_n(size); 
    int a = foo(true); 

    int *side_local = new int[size]; 
    for(int i = 0; i < size; i++) { 
     side_local[i] = 0; 
    } 
    side = side_local; 
    return 0; 
} 

int main() 
{ 
    A a; 
    vector<int> t = {1, 2, 3}; 
    a.bar(t); 
    return 0; 
} 
+1

Почему вы включили '', но не использовали его здесь:' int * side_local = new int [size]; '? Почему не просто 'std :: vector side_local (size);'? Или просто просто 'side.resize (size);' и не делать какой-либо из этого кода? – PaulMcKenzie

+1

Это зависит от контекста, и вы ничего не даете. Что такое массив, который должен представлять? Связано ли это с А? Должен ли он принадлежать A? Почему бы не использовать вектор? Вы не будете делать копии, передавая ссылку или указатель вокруг ... – Nelfeal

ответ

1

Рекурсивный вызов может передать указатель на себя:

void foo(int *pList) 
{ 
    foo(pList); // recursive 
} 

тот же список, затем прорабатывается.

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

class A 
{ 
    int *pMemberList; 
    ... 
    void foo(); 
} 

сейчас foo может видеть pMemberList все время.

BUT ... прохождение, вероятно, это лучший вариант, так как в будущем ваш класс может разместить 2 списка, которые вы хотите сделать foo.

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