2014-01-09 3 views
0

В следующем кодеЧто означает явно инициализация элемента?

class someClassB; 

class someClassA 
{ 
public: 
    someClassA(int x, int y); 
private: 
    someClassB* B; 
}; 

class someClassB 
{ 
public: 
    someClassB(int x, int y); 
private: 
    int x; 
    int y; 
    someClassA A; 
}; 

someClassA::someClassA(int i, int j) 
{ 
    B->x = i; 
    B->y = j; 
} 

someClassB::someClassB(int i, int j) 
{ 
    x = i; 
    y = j; 
    A = new someClassA(i, j); 
} 

почему я получаю сообщение об ошибке говорящего «Конструктора для„someClassB“должен явно инициализировать элемент„A“, который не имеет конструктора по умолчанию»? Я не инициализирую 'A' в конструкторе someClassB?

ответ

5

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

someClassB::someClassB(int i, int j) : x(i), y(j), A(i, j) 
{ 
} 

Здесь x и y также инициализируется в списке инициализации конструктора, а не по умолчанию инициализируется, а затем присваиваются значения, как в вашем коде.

отметить также, что, в общем, это не имеет никакого смысла в C++:

A = new someClassA(i, j); 

new возвращает указатель.

4

Учитывая, что вы используете A с new, я подозреваю, что вы имели в виду, чтобы объявить его как указатель:

someClassA* A; 

Если нет, то вам необходимо инициализировать его в someClassB «s initializer list.

0
someClassA::someClassA(int i, int j) 
{ 
    B->x = i; 
    B->y = j; 
} 

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

A = new someClassA(i, j); 

А не является указателем это экземпляр someClassA

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