2015-12-08 3 views
0

Здравствуйте я больше знакомы с Java, чем C++C++ делегировании Конструкторы

test.h:

class Test 
{ 
private: 
int a,b,c; 
public Test(int a, int b, int c); 
} 

test.c

Test::Test(int a, int b, int c) 
{ 
this->a = a; 
this->b = b; 
this->c = c; 
} 
Test::Test(int a, int b) 
{ 
this(a, b, 0); 
} 
Test::Test(int a) 
{ 
this(a, 1) 
} 
Test::Test() 
{ 
this(2) 
} 

1 - Должен ли я вводить каждый конструктор подпись в test.h?

2 - Как я могу написать несколько определений конструкторов?

3 - Я читал, что вы можете объединить несколько конструкторов в 1 определение с использованием значений по умолчанию. Как это делается

Спасибо

ответ

1
  1. Да

  2. Введите их

  3. Почему бы не использовать Test(int _a, int _b = 1, int _c = 0);

и определяют с

Test::Test(int _a, int _b, int _c) : a(_a), b(_b), c(_c) 
{ 
} 

i.e.Показать значения по умолчанию и использовать инициализацию базового элемента?

Это также 11

0

Ваш синтаксис конструктора делегации обработки перед C++ неправильно. Вы должны использовать список Инициализатора членов делегировать другой конструктор:

Test::Test(int a, int b) 
    : Test(a, b, 0) 
{ 
} 
Test::Test(int a) 
    : Test(a, 1) 
{ 
} 
Test::Test() 
    : Test(2) 
{ 
} 
0

делегирование Конструкторы доступны только в C++ 11. Синтаксис выглядит так:

Test::Test(int a1, int b1, int c1) : 
    a{a1}, b{b1}, c{c1} 
{} 

Test::Test(int a, int b) : 
    Test(a, b, 0) 
{} 

Test::Test(int a) : 
    Test(a, 1) 
{} 

Test::Test() : 
    Test(2) 
{} 

Я также использовал синтаксис инициализации в первом конструкторе. Это предпочтительнее, потому что иначе объект-член будет инициализирован конструктором по умолчанию, а затем назначен новое значение.

1

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

// declaration 
struct X 
{ 
    X(int a, int b, int c); 
    X(int a, int b); 
    X(int a); 
    X(); 

private: 
    int a,b,c; 
}; 

// definition  
X::X(int a, int b, int c) 
: a(a), b(b), c(c) 
{} 


X::X(int a, int b) 
: X(a, b, 2) 
{ 
} 


X::X(int a) 
: X(a, 1, 2) 
{ 
} 

X::X() 
: X(0,1,2) 
{ 
}