C ++ конструктор путаница - PullRequest
       1

C ++ конструктор путаница

1 голос
/ 09 декабря 2011
MyObject obj = new MyObject(para1);

В Java я всегда могу сделать это при переключении на C ++, это выдает мне ошибку: запрошено преобразование из «MyObject *» в нескалярный тип «MyObject».

Кажется, способ исправить это MyObject* obj = new MyObject(para1);.

Что если мне нужен сам объект, а не указатель на объект?

Будет ли MyObject obj(para1); единственным способом, который мне подходит?

Поскольку я переключаюсь с Java на C ++, мне также интересно:

MyObject* obj1 = new MyObject(para1);

Если я распечатаю значение obj1, это будет адрес.

MyObject obj2(para1);

Каким будет распечатанное значение для obj2?

Ответы [ 6 ]

4 голосов
/ 09 декабря 2011

Будет ли MyObject obj(para1); единственным способом, который мне подходит?

Да, это нормальный путь.

Что будет напечатано-out значение для obj2?

Если вы не перегружаете правильный оператор, вы получите ошибку компилятора. Вы определяете способ печати вашего объекта, используя функцию со следующей подписью:

std::ostream & operator<<(std::ostream & os, const MyObject & obj);
3 голосов
/ 09 декабря 2011

В некоторых случаях * вы также можете сделать:

MyObject obj = MyObject(para1);

В отличие от Java, объекты не наследуют метод toString от некоторого базового класса.Поэтому вы не можете распечатать значение obj2, если не определили механизм для этого.Стандартный способ - перегрузить operator<<:

class MyObject
{
public:
    int x;
};

std::ostream &operator<<(std::ostream &os, const MyObject &obj)
{
    os << obj.x;
    return os;
}

...

MyObject obj;
obj.x = 42;
std::cout << obj << "\n";


* А именно, если у класса есть открытый конструктор копирования.
0 голосов
/ 09 декабря 2011

Кажется, способ исправить это MyObject * obj = новый MyObject (para1);.

Да.Результатом new всегда является указатель на объект.
Обратите внимание, что в C ++ очень редко используются указатели RAW (обычно вы помещаете указатель в умный указатель, чтобы он был правильно удален).

Что если мне нужен сам объект, а не указатель на него?

MyObject obj(para1)   // Creates an normal automatic object
                      // The destructor for this obect is automatically called
                      // When the object goes out of scope (even when exceptions are thrown)

Мне также интересно:

MyObject* obj1 = new MyObject(para1);

Если я распечатаю значение obj1, это будет адрес.

Если вы распечатаете это:

std::cout << obj1;  // print the address (normally).

std::cout << (*obj1); // Will print the object/
                      // Assuming you have defined the output operator.

MyObject obj2(para1);
std::cout << obj2;    // Again prints the object
                      // Assuming you have defined the output operator.
std::cout << &obj2;   // prints the address.
0 голосов
/ 09 декабря 2011

Вы в значительной степени ответили на свой вопрос. Если вам не нужен указатель, не используйте new. Если вы новичок в c ++ и управлении памятью, и вам действительно нужно использовать указатель, я настоятельно рекомендую использовать умный указатель (например, boost: : shared_ptr) вместо необработанного указателя ..

Что касается второго вопроса, это зависит от того, что вы подразумеваете под распечаткой. Вы не можете просто распечатать объект, но вы можете вызвать метод, который знает, как распечатать этот объект. Вы должны определить этот метод, конечно. Примерно так:

std::ostream& operator<<(std::ostream& os, const MyObject& rhs)
0 голосов
/ 09 декабря 2011

В C ++ оператор new возвращает указатель на объект. Чтобы получить объект, необходимо разыменовать указатель с помощью оператора * (например, * obj).

0 голосов
/ 09 декабря 2011

Подумайте об операторе-указателе -> или (*obj).func()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...