Если я объявляю объект в основном, тогда вызывайте эту функцию класса (хотя внутри функции я использую оператор new для объявления объекта другого класса), будет ли этот вложенный объект оставаться в области видимости после вызова функции-члена? другими словами, могу ли я использовать этот объект по-прежнему на главном? Я собирался создать вектор указателей и назначить каждой позиции новый объект, созданный вызовом функции класса.
Заранее спасибо! Пожалуйста, дайте мне знать, если мой вопрос нечеткий. PS Если я должен определить деструктор в файле.h, чтобы удалить то, что было создано с новым, правильно? Компилятор автоматически выполняет это?
int main()
{
Ship *list[5] = { 0, 0, 0, 0, 0 };
char ch;
int x1,y1,x2,y2;
int n = 0;
cin >> ch >> x1 >> y1 >> x2 >> y2;
while ( cin )
{
try
{
Ship *p = Ship::makeShip(ch,x1,y1,x2,y2);
list[n++] = p;
}
В моей программе makeShip возвращает указатель на новый объект корабля. Почему я могу использовать объект "Корабль" во всей моей основной()? Я думал, что это выходит за рамки после второй} окончательной скобки для попытки? Благодарю!!
В этом случае это зависит от реализации Ship::makeShip
.
makeShip
хранит указатель на некоторое хранилище (например, static std::vector
указателей std::unique_ptr
), тогда память будет удалена после выхода из программы. В этом случае вам не нужно удалять list
вручную, потому что у вас есть только ссылки.Ship::makeShip
возвращает указатель, который необходимо удалить вручную. В этом случае для всех элементов списка delete
оператор должен быть вызван.И последний,
Плохая практика - вернуть сырые указатели, действительно непонятно, как с этим бороться, когда удалять, кто владеет и так далее.
Лучше вернуться, например, std::unique_ptr
или std::shared_ptr
.
В первом случае ясно, что вы становитесь владельцем указателя. Во втором случае не имеет значения, кто владеет, поскольку совместное владение
Все, что создано с new
остается в живых до тех пор, пока вы не уничтожите его delete
. Таким образом, объект остается в области видимости и до тех пор, пока у вас есть ссылка на ссылку на объект, вы можете получить к нему доступ.
После использования функции " }
исключаются только automatic
переменные. В вашем случае вы можете получить доступ к объектам Ship
через list
.
Хотя я бы порекомендовал std::array<Ship>
или std::vector<Ship>
вместо Ship *[]
РЕДАКТИРОВАТЬ
После того, как ваш вопрос будет отредактирован и добавлен раздел кода, будет ли объем объектов Ship
заканчиваться после }
или нет, зависит от того, что и как возвращает Ship::makeShip
.