2013-06-25 3 views
0

Безопасно ли возвращать объект из пространства имен. В приведенном ниже коде call() возвращается объект мешка по стоимости. Но объем вновь созданного объекта находится в пространстве имен ... так что сомневался, что это правильный способ сделать это.безопасно ли возвращать объект из пространства имен?

namespace abc{ 

class bag{ 

    public: 
     bag() 
     { 
      cout<<"\nconstructor called"; 
     } 
     ~bag() 
     { 
      cout<<"\ndestructor called"; 
     } 
     bag(bag &c) 
     { 
      cout<<"\ncopy constructor called"; 
     } 
     bag call() 
     { 
      bag f; 
      return f; 
     } 
}; 

Мой второй вопрос касается копирования конструктора. В main() я пытаюсь вызвать конструктор копирования, используя следующее выражение, но компилятор бросает ошибку ... Как я могу добиться этого

abc::bag b; 
abc::bag c=b.call(); // trying to call copy constructor ,but getting compile time error 
+0

Какова ошибка времени компиляции? –

+1

У вас нет сомнений, у вас есть вопросы, см. Http://www.cs.uic.edu/bin/view/Jakob/IndianEnglish –

ответ

4

Там нет никакой опасности whatsover в возврате объекта из функции члена класс, принадлежащий некоторому пространству имен. Я не вижу, какие проблемы вы можете иметь в виду.

Что касается второй задачи, то есть потому, что выражение:

b.call() 

дает RValue (временный объект), и ваш конструктор копирования принимает ссылку Lvalue:

bag(bag& c) 

Так как Lvalue ссылки не могут связываться с rvalues, компилятор кричит на вас. Вы должны позволить своему конструктор копии имеют каноническую подпись и принять Lvalue ссылку на const вместо (Lvalue ссылки на const могут связываться с rvalues):

bag(bag const& c) 
//  ^^^^^ 

В конце концов, вы обычно не нужны/хотят изменить объект вы хотите создать копию.

+0

@ user1057741: Я действительно не уверен, что понимаю, что вы говорите :( –

2

namespace is только вещь, используемая для разрешения имен. Это не влияет на время жизни объекта или что-то еще. Поэтому, если ваш код был прав за пределами пространства имён, это хорошо внутри.

И вы должны правильно использовать const в копии ctor (и отсутствует op =) подпись.

0

abc::bag c=b.call(); Это не имеет никакого отношения к конструктору копирования. Чтобы вызвать конструктор копирования, который вы внедрили, вы должны написать abc::bag c(&b)

+0

'& b' выводит указатель на' abc :: bag' ('abc :: bag *'). Конструктор-копир обычно принимает константу-ссылку ('abc :: bag const &'). Таким образом, ваш код выиграл ' t вызовите конструктор копирования. –

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