두 클래스 A 클래스와 B 클래스가 있습니다. 두 인스턴스 모두 인스턴스화해야하므로 기본 생성자를 갖고 싶지 않습니다. 매개 변수가있는. 그러나 클래스 정의를 사용하지 않고 클래스를 인스턴스화 할 수있는 기본 공용 생성자를 사용하지 않고 클래스 B 내부에 클래스 A의 객체를 만들 수 없습니다 (기본값을 피하기 위해 노력하고 있음). 나는이 개체의 인스턴스를 만들C++ 포인터가없는 다른 클래스 생성자 안에 기본 생성자가없는 개체 인스턴스화
ClassA.h
Class A //No default constructor
{
public:
A(int var1, int var2); //Class A's Constructor
}
: 나는 다른 클래스 B의 내부 초기화하려고 개체의
등급 :
이
내 설정이다 클래스 B를 인스턴스화 할 때 클래스 B에 전달 된 값이 필요하기 때문에 인스턴스화됩니다.ClassB.h
Class B //No default Constructor
{
public:
A myClassA; //The public variable in class B I want to hold an object of class A
int somePublicVar;
B(int var1, int var2, int var3); //Class B's Constructor
}
유형 A의 myClassA 객체를 인스턴스화 할 수 없습니다.
ClassB.cpp는
B::B(int var1, int var2, int var3)
{
B = A(var1, var2);
somePublicVar = var3
}
나는 C++에 새로운 오전하지만 난 C# 및 C를 매우 잘 알고하지만이를 완료 할 수있는 권리 구문/프로세스를 찾을 수 없습니다.
이 문제와 관련된 질문을 많이 읽을수록 객체를 수동으로 파괴해야하므로이 문제를 해결하기 위해 포인터를 사용하는 것이 "초보자"방식 인 것으로 보입니다. 포인터없이 이것을하는 것. 가능한가? 이 과정에서 가장 좋은 방법은 무엇입니까?
나는이 할 때 나는이를 달성하기 위해해야 만약 내가 포인터에 의지하지만, 내가 대신 객체의 포인터로 정의하면, 나는 오류가 발생하기 때문에 내가 너무 그 작동에 어려움을 겪고 오전 :
을myClassA = & A (var1, var2);
"A (var1, var2)"의 범위가 생성자이며 생성자가 완료된 후에 삭제되므로 "비표준 확장이 사용됨 : lvalue로 사용 된 클래스 rvalue"가 표시됩니다. 포인터를 저장하십시오. 그래서 나는이 경우에도 포인터 접근 방식을 어떻게 활용할 것인지 잘 모르겠습니다.
이 질문에 부분적으로 답을 찾을 수 있지만 모든 조건을 만족하는 것 같지 않습니다. 도움에 감사드립니다.
편집 9/14/17 :
은 내가 어떻게 방지 할 수 있습니다, 나 또한 내가 기본 생성자가없는 경우 클래스 B의 내부 공용 변수로 myClassA을 가지고 노력하고 있음을 언급하는 것을 잊었다 "No Default Constructor"오류가 발생하는 이유는 무엇입니까?위의
감사합니다. 나는 그와 같은 빠른 대답을 appreacite한다. 하지만 myClassA를 클래스 B 내부의 공용 변수로 정의하려면 어떻게해야합니까? 그것은 나에게 기본 생성자 오류를 계속 제공합니다. – WhatIsASyntax
@WhatIsASyntax 오류가 발생하지 않아야합니다. 'A'의 기본 생성자를 호출 할 수있는 모든 장소를 확인하십시오. 다음은 실제 예입니다. 출력에 컴파일러 오류가 표시되지 않습니다. http://coliru.stacked-crooked.com/a/d94463408244b094 –
@WhatIsASyntax 'B'의 멤버로 'A'에 대한 포인터를 원하면 다음과 같이 할 수 있습니다 :'class B {unique_ptr p; B :: B (int var1, int var2, int var3) {p = make_unique (var1, var2);}'. – AlexD