2015-05-14 4 views
0

Конструктор объекта World в следующей программе вызывается дважды.Почему конструктор дважды называется в моей программе?

заголовочный файл:

#ifndef GAME_H 
#define GAME_H 
#include "World.h" 

class Game 
{ 
    public: 
     Game(); 
    private: 
     World world; 
}; 

CPP файл: -

#include "Game.h" 

Game::Game() 
{ 
    world = World(); 
} 

Header файл мирового класса: -

#ifndef WORLD_H 
#define WORLD_H 

class World 
{ 
    public: 
     World(); 
}; 
#endif // WORLD_H 

CPP файл класса World: -

#include "World.h" 
#include <iostream> 

using namespace std; 

World::World() 
{ 
    cout<<"i am going to print twice"<<endl; 
} 
+0

[SSCCE] (http: //www,sscce.org) пожалуйста. –

ответ

6

Каждый элемент автоматически инициализируется перед началом конструктора; поскольку вы не включаете world в список инициализаторов, он инициализируется по умолчанию в этой точке, вызывая ваш конструктор.

Затем вы создаете для него временный объект; который вызывает вызов второго конструктора. Это не нужно делать.

4

Определение вашего класса говорит, что Game имеет член World, поэтому создание экземпляра игры автоматически создаст мир. Затем в вашем конструкторе вы назначаете this->world второй раз и создаете второй экземпляр, так что это второй вызов.

Вы можете полностью исключить линию в своем конструкторе. Если у вас есть аргументы, которые вы хотите передать, чтобы инициализировать World, то вы можете сделать

Game::Game(someArg) : world(someArg){ 

} 
+0

Зачем вызывать конструктор копирования класса 'World', когда вы можете напрямую передать' someArg' в 'World :: World'? – Downvoter

+0

Просто опечатка, исправлена. – loganfsmyth

1

Когда Game построен World также конструктором по умолчанию, как это член World, это кулак.

Второй раз в Game::Game: вы создаете временный объект World и назначаете его World::world со следующим кодом.

world = World(); 

То, что вы, вероятно, хотите, это:

Game::Game() 
{ 
} 

Вам не нужно строительство и назначение по умолчанию.

+0

Вы должны быть быстро здесь, кажется :) – Steve

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