C ++, как сделать прототип такого конструктора? - PullRequest
0 голосов
/ 01 июня 2019

Я, честно говоря, даже не уверен, как это Google, и, поскольку мои попытки не увенчались успехом, можете ли вы сказать мне, как написать прототип конструктора, чтобы я мог использовать его таким образом?

// MyClass.h
class Object;
class MyClass {
    Object a;
    Object b;
    std::string c;

    public:
    MyClass(int, int, std::string&); // I do not know how to declare this properly
};
// so that I can write this:
MyClass::MyClass(int a, int b, std::string& c = "uninstantialised") : a(a), b(b) {
    this->c = c;
}
// so that when I call the constructor like this:
Object a();
Object b();
MyClass mc(a, b);
// it doesn't produce an error when std::string argument is not specified.

Спасибо! * * 1004

1 Ответ

3 голосов
/ 01 июня 2019

Аргументы по умолчанию должны быть указаны в объявлении, а не в реализации. Кроме того, вы должны взять строку по значению, а не по ссылке, и переместить ее в MyClass::c член:

public:
    MyClass(int a, int b, std::string c = "uninstantialised");

// ...

MyClass::MyClass(int a, int b, std::string c)
    : a(a), b(b), c(std::move(c))
{ }

Взятие по значению и использование std::move() не требуется, но рекомендуется, поскольку это может быть более эффективным, поскольку в некоторых случаях позволяет избежать копирования строки.

Я рекомендую переименовать личные элементы данных во что-то, что не позволяет использовать то же имя для чего-то другого. Здесь c является как закрытым членом, так и параметром конструктора. Вы должны использовать что-то другое для участников. Например, a_, b_ и c_. Добавление подчеркивания - это популярный способ присвоения имен частным членам данных.

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