2013-06-13 3 views
0

У меня есть класс, единственный конструктор которого принимает целое число, и я хотел бы использовать его в другом классе, не делая его указателем и используя new/delete.Объявление класса с помощью специального конструктора в другом классе

Возможно ли это?

Соответствующие части первого класса:

class A 
{ 
    private: 
    int size; 
    char *c; 

    public: 
    A(int i) 
    { 
    size = i; 
    c = new char[i]; 
    } 
    ~A() { delete[] c; } 
} 

И я хочу, чтобы использовать его в качестве примера класса B следующим образом:

class B 
{ 
    private: 
    A a(7); // Declaration attempt #1 
    A b; //Declaration attempt #2 
    A *c; //This is what I'll do if I have no other choice. 

    public: 
    B() 
    { 
    b = A(7); //Declaration attempt #2 
    c = new A(7); 
    } 
} 
+0

вы скомпилированный код? что компилятор говорит? Вы пропустили ';' для класса после '}' – taocp

+0

# 1 работает в C++ 11 и # 2 работает в любом месте. Просто никогда не используйте «новые», если у вас действительно нет веских оснований. – chris

+0

@taocp: Я набрал эти теоретические классы, чтобы сузить точку зрения, о которой я просил, не вставляя 60-ти линейный класс, поэтому я удивлен, что я только получил; неправильно! – SVC

ответ

4

В классе инициализации объекта с использованием () не представляется возможным потому что он интерпретируется как объявление функции. Вы можете использовать этот список член-инициализатора сделать это вместо:

class B 
{ 
    A a; 

    public: 
     B() : a(7) 
    //  ^^^^^^ 
     {} 
}; 

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

В C++ 11 вы можете использовать единообразную инициализацию:

class B 
{ 
    A a{7};                 /* 
    ^^^^^^^                 */ 

    public: 
     B() = default; 
}; 
+0

Да, это то, что мне нужно! Спасибо! Теперь ... скажем, мне нужно было объявить «A1, a2;», как бы я начал инициализировать «a1» и «a2»? – SVC

+0

@SVC. Вы должны использовать оба в списке mem-initializer: 'B(): a1 (5), a2 (6) {}' или в C++ 11: 'A a1 {5}, a2 {6}; ' – 0x499602D2

+0

Awesome - большое спасибо! – SVC

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