В C ++, как вы можете создать экземпляр класса с вызовом структуры или ничего? - PullRequest
1 голос
/ 30 июня 2010

Я создаю класс.

Этот класс хранит пользовательские настройки в Struct.

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

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

Вот как это выглядит с указателями

struct preferences {};
class Useful 
{
public:
    Useful(preferences const * = NULL);
...
}

...

int main() 
{
   preferences * testPrefs;
   ...
   Useful testClass(testPrefs);
   // or if no prefs: Useful testClass;
   ...
}

Итак, как бы вы передали структуру предпочтений по ссылке при созданииэкземпляр класса со значением по умолчанию без структуры передается?Это строка, на которой я застрял, поскольку ни NULL, ни * NULL работать не будут:

class Useful 
{
public:
    Useful(preferences & = ???????);

Ответы [ 5 ]

7 голосов
/ 30 июня 2010
Useful(const preferences& p = preferences(...));
4 голосов
/ 30 июня 2010

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

Вы все еще можете получить то, что хотите.Напишите две перегрузки для вашего конструктора.Один берет ссылку, другой не принимает параметров и делает то же, что и другой конструктор, когда он получил нулевой указатель.

3 голосов
/ 30 июня 2010

Создайте статический экземпляр структуры preferences со значениями по умолчанию и используйте его в качестве параметра по умолчанию.Или заполните его «магическими» значениями, которые указывают на это как специальное зарезервированное значение.

2 голосов
/ 30 июня 2010

Вы можете просто перегрузить конструктор:

struct preferences {};
class Useful 
{
public:
    Useful(preferences&);
    Useful(); // In here, do whatever you would have done 
              // if preferences were NULL in the pointer example
}

По сути, это то, что в любом случае делает первая версия кода с указателем и аргументом по умолчанию, за кулисами.

1 голос
/ 30 июня 2010

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

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

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

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

...