2017-11-17 1 views
-3

내 프로그램에 2 개의 클래스가 있습니다. A 클래스와 B 클래스라고 부릅니다.다른 클래스의 인스턴스가있는 클래스, 기본 생성자가 필요한 Visual Studio

이러한 클래스 각각에 대해 생성자를 작성 했으므로 기본 생성자를 갖고 싶지 않습니다.

클래스 B는 클래스 B의 멤버 변수 중 하나로서 클래스 A의 인스턴스를 갖습니다.

Visual Studio는 {클래스 B 구현 파일 아래에 구불 구불 모양의 빨간색 선이 있습니다. 마우스를 올려 놓으면 Visual Studio에서 클래스 A에 기본 생성자가 없다는 불만을 표시합니다.

여기에 기본 생성자를 만들어야합니까?

편집 : 내가 주에서 개체를 만들 :

행렬은 동적으로 할당 된 2 차원 배열 (이 할당 된 모두 포인터에 대한 포인터입니다)입니다.

Board::Board(char ** array, int rows1, int columns1) 

//I initialize the elements of the array here. 

다음, 나는이 생성자로 생성 된 개체를 전달할 : 여기

Board newBoard(matrix, rows, columns); 

생성자입니다

Joe::Joe(Board theBoard, int x, int y) 

//Note that these x and y positions are basically positions of the player on the 
//board. They are not the rows and the columns of the array that we previously 
//created. 
+0

컴파일을 시도 했습니까? – Arash

+1

정확한 문제를 표시하려면 [mcve]를 만드십시오. 그러나 멤버가 포인터 또는 참조 유형이 아닌 경우 클래스는 기본 생성자를 사용하여 객체를 만들려고합니다 ( – UnholySheep

+0

) 클래스에는 기본 생성자가있을 필요는 없지만 기본값이 아닌 생성자 중 하나를 사용하여 초기화해야합니다 생성자. –

답변

0

당신에 대한 기본 생성자를 제공하지 않으려면 class A인데도 class B에 인스턴스를 갖고 싶다면 다음 두 가지 작업을 수행 할 수 있습니다.

1 :

class B 
{ 
public: 
    B(/*Some args*/); // constructor 
    A a; // instance of A 
}; 

같은 초기화 중 :

B::B(/*some args*/) 
    : a(/*whatever args a needs*/) 
    { 
     // other initialisation 
    } 

2 :

: 당신은 class B에 대한 포인터를 class A의 인스턴스를 만들 수 있습니다 당신은 A가 구축 B의 initalization 목록을 사용할 수 있습니다
class B 
{ 
public: 
    B(/*Some args*/); // constructor 
    A* a; // instance of A 
}; 

class B 님의 생성자 :

B::B(/*some args*/) 
{ 
    a = new A(/*some (other) args*/); // Make sure to also call delete A; when you dont need B anymore 
} 
+1

두 가지 제안의 순서를 바꿔야합니다. 초기화리스트가 필요한 경우 포인터를 찾을 필요가 없습니다. –

+0

공정한 점, 초기화 목록이 실제로 권장됩니다. 나는 그들을 바꿀 것입니다. –

+0

첫 번째 제안에 관해서도, A의 객체를 B의 생성자에 전달하더라도 여전히 그렇게해야합니까? – Floatingkeyboards

관련 문제