2016-09-26 5 views
0

첫 번째 생성자가 멤버 std::map을 편집 한 다음 다른 생성자를 호출합니다. 첫 번째 생성자의 끝에서지도의 크기는 2이고 두 번째 생성자의 시작 부분에서 0입니다.이 원인은 무엇입니까? 여기 C++ 클래스 생성자가지도를 지우습니다

내 헤더 파일입니다

// Test.h 
#include <map> 
#include <string> 

class Test 
{ 
public: 
    Test(std::string name, int age); 
private: 
    Test(); 

    std::map<std::string, int> myMap_; 
} 

그리고 여기 내 코드입니다 :

// Test.cpp 
#include "test.h" 

Test::Test() 
{ 
    std::cout << myMap_.size() << std::endl; // Outputs 0 
} 

Test::Test(std::string name, int age) 
{ 
    myMap_.insert(name, age); 
    myMap_.insert("test", 6); 

    std::cout << myMap_.size() << std::endl; // Outputs 2 
    Test(); 
} 

편집 :

#include "test.h" 

int main() 
{ 
    Test t("yo", 4); 
    return 0; 
} 
+0

그것은 다른 개체의 생성자입니다 ... 당신은 두 번 같은 일을 구축하고 싶어? 당신은 할 수 없습니다. 위임하는 생성자가 있지만이 방법은 수행자가 아닙니다. Test1을, Test2를하고 테스트 3 : 나는 두 번 일을 구성하지 않으려는 – LogicStuff

+0

@LogicStuff, 내가 3 생성자가 있습니다. Test1과 Test2는 맵에서 작동하고 둘 다 동일한 코드를 실행해야하기 때문에 Test3에게 마칩니다. init()과 같은 다른 메서드를 사용하여 나에게이 작업을 수행 할 수는 있지만 여전히 생성자의 일부이므로 생성자가 수행 한 것이 더 좋은 아이디어라고 생각했습니다. – Resantic

+0

@Resantic 더 나은 클래스 멤버를 초기화의 ctor - 초기화 기능을 사용하는 것입니다. 실제 코드를 게시하면 다른 사람이이를 구성하는 좋은 방법을 제안 할 수 있습니다. –

답변

3

두 번째 생성자 : 그리고 여기 내 주요 기능입니다 2 개의 요소를 삽입합니다. 따라서 크기는 2입니다.

첫 번째 생성자는 요소를 삽입하지 않습니다. 그래서 크기는 것 같아요 0


어쩌면 당신이 동일한 개체에 대한 "다른 생성자를 호출"두 번째 생성자 내부 Test();을 기대합니다. 그러나 이것은 일어나지 않습니다. 생성자는 일반 함수와 다릅니다.

코드 Test();은 실제로 Test 유형의 임시 개체를 만드는 것을 의미하며,이 개체는 기본 생성자를 호출하여 초기화됩니다. 그런 다음 그 객체는 일시적이므로 즉시 파괴됩니다.

생성자는 이름이 없습니다. 이름 조회과 관련하여 일반 함수처럼 호출 할 수 없습니다. 대신 객체를 생성하는 구문을 제공 할 때 호출됩니다.

여러 생성자가 공유하는 공통 코드를 원한다면; 다중 생성자가 호출하는 함수에이 코드를 삽입하거나 delegating constructors 기능을 사용할 수 있습니다. 후자의 경우 위임은 생성자 본문 내의 모든 문이 실행되기 전에 수행되어야합니다.

1

같은 개체에서 실제로 생성자를 호출하지는 않지만 임시 새 가상 개체를 만들면 이름이 없습니다. 이 같은로보기 :

Test::Test(std::string name, int age) 
{ 
    myMap_.insert(name, age); 
    myMap_.insert("test", 6); 

    std::cout << myMap_.size() << std::endl; // Outputs 2 
    Test other = Test(); //you create a new object here 
} 

를 C++ 11 (이이 생성자 위임이라고합니다)이 함께하고 싶은처럼 당신이 뭔가를 할 수에서 :

Test::Test(std::string name, int age) 
:Test() 
{ 
    myMap_.insert(name, age); 
    myMap_.insert("test", 6); 

    std::cout << myMap_.size() << std::endl; 
} 

의 차이를 여기하지만 Test() 생성자가지도에서 삽입 작업 전에 호출됩니다.

+0

그래, 왜 "뭔가"와 정확하게 같은 thats. 나는 대답에 그것을 추가 할 것이다. – Hayt

0

테스트의 두 인스턴스를 만듭니다.

Test의 첫 번째 인스턴스는 이름과 나이로 구성되며 요소를 myMap_에 삽입하지만 두 번째 인스턴스는 삽입하지 않습니다.

당신이 Test(name, age) 생성자 는지도에 삽입하지 않는 Test() 생성자를 사용하여 로컬 테스트의 두 번째 인스턴스를 만드는에서 Test() 전화

.이 두 번째 인스턴스는 거의 즉시 파기됩니다 (아무 것도 할당되지 않았으므로).

동일한 객체에서 두 개의 생성자를 사용하려고 시도했지만 이 상속 된 객체에서만 수행되며 각 파생 객체는 자체 생성자를 호출하고 그 기본 객체를 호출해야합니다. 당신은 함수를 만들 수 있고 그 대신 전화

:

// Test.h 
#include <map> 
#include <string> 

class Test 
{ 
public: 
    Test(std::string name, int age); 
    void OutputSize(); 

private: 
    Test(); 

    std::map<std::string, int> myMap_; 
} 

Test::Test(std::string name, int age) 
{ 
    myMap_.insert(name, age); 
    myMap_.insert("test", 6); 

    OutputSize(); 
} 

void Test::OutputName() 
{ 
    std::cout << myMap_.size() << std::endl; // Outputs 2 
} 
+1

다형성 객체와 비 다형성 객체간에 구성에 차이가 없습니다. 클래스에 기본 클래스 (다형성 또는 그렇지 않은 경우)가 있으면 파생 클래스의 멤버를 초기화하기 전에 기본 클래스 생성자가 호출됩니다. (기본 초기화하는 것은 정말 멤버를 초기화 같은 작업입니다) –

+0

아주 좋아, 다형성을 통해 상속 의미했다. 내가 강조하려고했던 것은 그게 당신이뿐만 아니라 파생 클래스의 생성자와 기본의 전화로, 당신이 동일한 개체에서 여러 생성자를 호출하는 경우 생각할 수있는 유일한 시간이다. –