2009-12-22 3 views
8

(다른 UDT의 몇 가지 객체를 보유하고있는) 내 클래스 중 하나에 대해 복사 생성자를 작성하는 경우, 실제로는 의미가 없더라도 해당 UDT의 기본 생성자를 만들어야합니다. 하나있어.필요한 기본 생성자를 처리하는 방법

공백 기본 생성자를 구현하고 완료하면됩니까? 기본 생성자가 호출되는 유일한 시간은이 복사 중에 개체가 만들어지고 해당 개체의 값이 개체에 복사 될 때입니다. 따라서 기본 생성자에서 객체에 할당 된 값은 실제로 사용되지 않습니다.

내가보기에 문제는 일부 멤버 변수가 빈 기본 생성자에서 초기화되지 않는다는 것입니다. 대신 더미 값을 제공하는 글을 작성해야합니까? 이것을 처리하는 다른 권장 방법은 무엇입니까?

편집 : 다른 클래스의 복사 생성자를 정의하는 경우 복사 생성자에 기본 생성자가 필요하지 않지만 필요하지 않으므로 복사 생성자에 기본 생성자가 필요 없다는 것을 알고 있습니다.

+0

Welcome to StackOverflow! 위대한 첫 번째 질문. – Sampson

+0

예제 코드가있는 것이 더 좋을 것입니다. –

답변

5

, 당신은 기본 생성자가 필요하지 않습니다 사양의 일부가 아니므로, 컴파일러는 당신을 위해 그것을하지 않습니다.

클래스에 사용자 정의 형식이 포함되어 있고 개체를 만들 때 컴파일러는 각 개체에 대한 기본 constuctor를 호출해야합니다.

그러나 개체의 데이터 멤버를 초기화하는 것은 컴파일러의 작업이 아니지만 수행해야한다고 가정합니다.

언급 한 경우 사용자 지정 복사본 생성자와 할당 연산자가 필요합니다.

+0

이 두 클래스에는 모두 복사 생성자가 아닌 생성자가 있습니다. 그리고 당신이 말하는 것은 사실이 아닙니다. –

+0

그건 아주 이상한 말입니다. 현재 C++에서는 하나의 생성자를 다른 것으로부터 "호출"할 수 없습니다.복사 생성자를 사용하면 이니셜 라이저 목록을 사용하는지 여부에 관계없이 단순히 기본 생성자를 사용할 수 없으며 단순히 불가능합니다. – AnT

+0

원본 예제의 요점은 Foo의 기본 생성자가 복사를 통해 호출되지 않았다는 것입니다. 이 예제를 편집하여 Foo의 기본 생성자를 제거하여 그 점을 더 잘 보여줍니다. 클래스에는 분명 복사 생성자 이외의 생성자가 있습니다. 객체의 첫 번째 인스턴스를 만드는 데는 다른 방법이 있습니까? 내 이해는 목적은 원치 않는 기본 생성자를 추가하지 않는 것입니다. – mrkj

2

당신 말 : 해당 개체 의

개체가 생성 된 후 값이 복사됩니다.

하지만 스스로에게 물어보십시오. "해당 객체"의 값은 처음에는 어떻게 얻을 수 있습니까? 나는. 해당 객체는 어떻게 생성 되었습니까?

This previous SO discussion은 문제를 명확히하는 데 도움이 될 수 있습니다.

4

실제로 복사 생성자가 필요하십니까? 기본 생성자가 정상적으로 작동하는 클래스를 만드는 것은 일반적이지 않지만 불가능합니다.하지만 사용자 정의 복사 생성자가 필요합니다. 아마도 당신은 수업을위한 코드를 게시 할 수 있습니까?

+0

딥 복사가 필요하므로 네. – Anonymous

+0

C++은 실제로 "딥 카피 (deep copy)"라는 용어를 사용하지 않습니다. 코드를 게시하면 훨씬 더 명확 해집니다. –

+0

딥 카피라고하지 않으면 뭐라고 부릅니까? – Anonymous

1

복사 생성자를 구현하는 가장 좋은 방법은 아닙니다. 포함 된 유형이 복사 생성자 자체를 제공하는 경우이를 사용합니다. 결국 형식이 기본 생성자를 제공하지 않는 이유가있을 수 있습니다. 그 UDT를 복사하는 것은 오히려 더 적절한 사본 생성자보다는 기본 생성자를 포함하는 이유

1

은 내가 먼저 물어 것입니다. 나는 또한 객체가 기본값 인 초기화 상태 —에 무엇을 의미하는지, 그리고 모든 것을 구현한다는 것을 의미하는지 묻습니다.

기본 초기화에 대한 합리적인 의미가없고 기본 생성자를 사용하여 개체를 완전히 정의해야하는 경우 기본 생성자를 구현할 수 있다고 가정합니다.

그러나 모든 개체가 기본 생성자를 얻을 수있는 것은 아니므로 문제의 원인을 수정하는 것이 좋습니다.

0

다른 생성자도 복사 생성자를 필요로하여 기본 생성자를 방지 할 수 있습니다 (또는 개체를 생성하는 데 필요한 모든 정보를 전달하는 특수 생성자를 사용하십시오.) 일반적으로 모든 멤버 변수를 초기화하지 않는 기본 생성자는 아주 나쁜 생각입니다. 최소한 다른 클래스의 기본 생성자가 모든 멤버를 초기화하는지 확인하십시오.

3

다른 클래스를 복사 할 때 다른 개체를 복사하여 개체를 만들 때처럼 복사하는 것이 좋습니다. 무언가로 그까지 엄지 손가락의 규칙을 기억

Foo constructor (int) 
Bar constructor (default) 
Foo constructor (copy) 
Bar constructor (copy) 
0

:에

#include <iostream> 
using namespace std; 
class Foo { 
    Foo();   /* no default constructor */ 
public: 
    Foo(int i)  { cout << "Foo constructor (int)" << endl; } 
    Foo(const Foo& f) { cout << "Foo constructor (copy)" << endl; } 
}; 
class Bar { 
    Foo f; 
public: 
    Bar()    : f(1) { cout << "Bar constructor (default)" << endl; } 
    Bar(const Bar& b) : f(b.f) { cout << "Bar constructor (copy)" << endl; } 
}; 
int main(void) { 
    Bar b; 
    Bar b_=b; 
    return 0; 
} 

결과 : 당신이 복사 생성자에서 초기화리스트를 사용하는 경우

0

컴파일러에서 복사 생성자를 생성하지 않거나 복사 생성자를 전혀 원하지 않는 경우 개인용 복사 생성자를 선언하지만 해당 생성자에 대한 정의 (코드)를 제공하지 마십시오. 컴파일러는 선언을보고 생성하지 않습니다. 또한 할당 연산자를 사용하여이 작업을 수행하십시오.

내 싱글 톤 클래스로이 작업을 수행합니다.

0

클래스가 기본적으로 생성되지 않는다면 기본 생성자를 생성하지 마십시오. 그렇다면 확실한 초기화를 알아낼 수있을 것이라고 확신합니다. 그래야 사용하게됩니다.

0

당신이 말한 방식대로 질문하는 것이 이치에 맞지 않는 것처럼 보입니다. 당신이 믿는 것처럼 복사 생성자는 기본 생성자를 필요로하지 않습니다. 복사 생성자는 객체 자체를 완전하게 구성하는 완전히 독립적 인 본격적인 생성자입니다.

복사 생성자를 사용하여 개체를 구성하면 기본 생성자가 필요하지 않습니다. 기본 생성자로 객체를 구성하면 복사 생성자를 사용할 수 없습니다. 두 개의 다른 생성자를 같은 객체에 "적용"하는 것은 불가능합니다.

두 가지 방법으로 개체를 구성하면 두 가지 완전히 독립적 인 생성자가되며 각각 고유 한 독립적 목적이 있습니다. 이 경우 자신에게 묻어야하는 질문은 의 개체가 defualt-construct되기를 원한다는 것입니다. 너만 알 잖아.

다시 질문을 명확히해야합니다. 나는 당신이 구현하려고 시도하는 것이 복사 생성자가 아니라 복사 할당 연산자라는 것을 (당신의 설명에서) 의심 할 것이다. 그러나 그것은 단지 야생의 추측입니다.

관련 문제