2015-01-07 7 views
1

Я хочу передать объект-указатель функции по ссылке. Я не знаю, если я делаю правильно, так как он не работает в соответствии с приведенным ниже кодом. Пожалуйста, помогите мне.Ссылка на указатель на C++

class Base 
{ 
    public: 
    int x; 
    void print()// function prints x value 
    { 
     cout<<x; 
    } 
    void call_print(Base **base) //function call print function 
    { 
     base->print(); 
    } 
}; 
int main() 
{ 
    Base *b = new Base; // creating pointer object 
    b->call_print(&b); // passing pointer by reference 
    return 0; 
} 
+4

1) это не ссылка, но указатель на указатель 2) в любом случае, не требуется, если вы не хотите изменить то, на что указывает, и 'base-> print' не будет работать с' Base ** '3), почему даже использовать' new' (и вы все равно не «удаляете»). – crashmstr

+1

Удалите одну звездочку в объявлении 'call_print':' void call_print (Base * base) '. Также вызовите 'b-> call_print (b)' в 'main' функцию. –

+1

Если вы на самом деле намерены использовать двойной указатель: if (base) {(* base) -> print(); } – dwn

ответ

2

можно передать объект с помощью «ссылки» в том смысле, что вы по-прежнему иметь доступ к исходному объекту через параметр, но обратите внимание, что base в call_print() является указателем на объект передается в , а не объект. Вы все еще должны разыменования указателя, если вы хотите получить доступ к объекту, принятому в:

(*base)->print(); 

C++ введены фактические ссылки, которые являются синтаксический сахар на то, что вы должны делать с указателями/двойными указателями. Например:

void call_print(Base*& base) 
{ base->print(); } 

b->call_print(b); 

Кроме того, использование двойного указателя или ссылки кажется ненужным, так как вам не нужно, чтобы изменить указатель в любом случае. Почему бы просто не взять сам указатель?

void call_print(Base* base) 
{ base->print(); } 

b->call_print(b); 

И, наконец, вам не нужно проходить b в качестве аргумента к своему собственному методу. Указатель на Base объект доступен через this:

void call_print() 
{ 
    print(); /* or this->print() */ 
} 

b->call_print(); 
-1
#include <iostream> 
using namespace std; 
class Base 
{ 
    public: 
    int x; 
    void print() 
    { 
     cout<<x<<endl; 
    } 
}; 
class Base2 
{ 
    public: 
    void change_value(Base *&base) 
    { 
     base->x = 5; 
    } 
}; 
int main() 
{ 
    Base *b = new Base; 
    Base2 b2; 
    b2.change_value(b); 
    b->print(); 
    delete b; 
    return 0; 
} 
+0

Это то, что я хотел сделать. Спасибо, что помогли мне. Сейчас работает :) –

+0

Вы можете изменить 'x', если вы передаете не указатель' Base' по ссылке! (Другими словами, вам не нужны указатели вообще, просто ссылки на C++) – crashmstr

0

простое примечание: не использовать голые указатели, воспользоваться C++ 11 объектов: станд :: unique_ptr и станд :: shared_ptr еще лучше, ради управления ресурсами, и вы можете написать что-то вроде этого:

std::unique_ptr<Base> base_ptr(new Base()); 
base_ptr->call_print(); 
//no delete, unique_ptr deletes itself automatically 

и для базового класса, вы должны написать:

void call_print() //function call print function 
{ 
    this->print(); 
} 

потому что вам не нужно проходить к тому же объекту, ссылку на себя.

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