2013-09-18 2 views
0

Мне нужно использовать var из ссылки указателя в другой функции, поэтому, когда я вызываю, что передаю значение адреса, но как я могу использовать этот указатель там (не создавая другой экземпляр)? Посмотрите сегмент кода:Использование указателей ссылки

//Main region - using Product class -> _products = vector<Product> 
int main() 
{ 
    _products.reserve(2); 
    for(i=0;i<2;i++) 
     productRefe.SetProduct(&_products); 
    return 0; 
} 


//Method in Product.cpp 
void Product::SetProduct(vector<Product> *productsP) 
{ 
    vector<Product> products = *productsP; 
    Product productInsert; 
    cout << "Type the description: "; 
    cin >> productInsert.Struct.description; 
     products.push_back(productInsert); 
} 

    void Product::GetProducts(string description, bool all, vector<Product> *productsP) 
    { 
int i = 0; 
vector<Product> products = *productsP; 
if(all) 
    for(i = 0; i < products.size(); i++) 
    { 
     cout << "Description: " << products[i].Struct.description << endl; 
     cout << "Value" << products[i].Struct.value << endl << endl; 
      } 
    } 

Я считаю, что проблема находится в первой строке в методе SetProduct ... Но то, что я могу изменить, чтобы она работает? Благодаря

+1

Помните, что «ссылка» имеет важное значение в C++, и ваш вопрос/код не использует его таким образом. http://en.wikipedia.org/wiki/Reference_(C%2B%2B) – kfsone

+0

Ok @kfsone .... спасибо за полезное решение;) – MGE

ответ

1

Вышеуказанные альтернативы лучше, но это будет работать также (локальная переменная является ссылкой): vector<Product> &products = *productsP;

+0

Это работает как я хочу, спасибо – MGE

1

Предлагаемые альтернативы:

// Declare a reference in your signature (instead of a pointer) 
void Product::SetProduct(vector<Product>& products) 
{ 
    Product productInsert; 
    cout << "Type the description: "; 
    cin >> productInsert.Struct.description; 
     products.push_back(productInsert); 
} 

... или ...

void Product::SetProduct(vector<Product> *productsP) 
{ 
    Product productInsert; 
    cout << "Type the description: "; 
    // Declare a pointer ... and simply use the pointer as a pointer 
    cin >> productInsert.Struct.description; 
     products->push_back(productInsert); 
} 

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

ИМХО ... и я надеюсь, что помогает ...

+0

Да, звучит хорошо ... но мне нужно получить индекс по индексу по функции GetProducts, и я не могу сделать это с ссылкой на указатель (я думаю) – MGE

+2

Следует также отметить, что: «vector products = * productsP» копирует содержимое, на которое указывает продукцияP, в продукты, а впоследствии продуктыP никогда не обновляются , – jsidhu

+0

@MGE, если вы используете ссылку для GetProducts, вы можете использовать оператор индекса как обычно. То есть cout << продукты [i]. – jsidhu

0

В функции, не сделать копию, но использовать *productsP непосредственно, например:.

cin >> productsP->Struct.description; 
+0

Извините ... но товарыP - вектор продукта – MGE

1

Ваш код добавляет новый продукт в вектор, а затем разрушает новый вектор почти сразу.

void Product::SetProduct(vector<Product> *productsP) 
{ 
    vector<Product> products = *productsP; // creates a new vector<Product> and copies the vector pointed to by ProductsP into it 
    Product productInsert; 
    cout << "Type the description: "; 
    cin >> productInsert.Struct.description; 
     products.push_back(productInsert); // adds the new product to the new vector<Product> 
    // as this function exits, products goes out of scope and is destroyed, so no change is ever saved 
} 

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

class Products 
{ 
// other members/functions 
public: 
    void AddProduct(const Product& prod) 
    { 
     m_Products.push_back(prod); 
    } 
private: 
    std::vector<Product> m_Products; 
}; 

Или, используя только саму коллекцию. То, что вы опубликовали, приведет меня к мысли, что вы смешиваете проблемы в своем классе.

+0

Это еще один хороший способ, спасибо, но я использую решение @Jason ** vector & products = * productsP; ** – MGE

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