У меня есть следующий класс:
class ShaderProgram {
private:
GLuint shaderProgram;
std::string getCompilationError(GLuint shader);
std::string getLinkingError(GLuint shaderProgram);
public:
// ! Might throw exception !
ShaderProgram(const std::string &vertexShaderPath, const std::string &fragmentShaderPath);
~ShaderProgram();
// Delete the copy constructor and assignment operator, you should not copy this class
ShaderProgram(const ShaderProgram&) = delete;
ShaderProgram* operator=(const ShaderProgram&) = delete;
// We do allow move constructor and move assignment
ShaderProgram(ShaderProgram&& other);
ShaderProgram& operator=(ShaderProgram&&);
};
Вам не разрешено копировать и экземпляр этого класса из-за GLuint shaderProgram
: его нужно удалить ровно один раз, поэтому, если кто-то делает копии объекта ShaderProgram
и одна из копий разрушается, все они становятся непригодными для использования.
Теперь конструктор может бросить. Например: если файл не найден или возникли ошибки при компиляции/линковке gsl. Я хочу поймать эти ошибки, вывести красивое сообщение об ошибке и выйти из программы. Если ошибки нет, я могу продолжить, но я застрял, вытаскивая объект из области попытки. Единственное решение, которое я вижу, это использовать указатели:
ShaderProgram* program;
try {
program = new ShaderProgram("PATH", "PATH");
} catch (Exception e) {
// print error
// Exit the program
}
// code
delete program;
Но теперь мне приходится вручную вызывать удаление, чего я не хочу делать, если в этом нет особой необходимости. Чтобы исправить это, я могу использовать unique_ptr
или что-то в этом роде, но я чувствую, что должно быть более правильное решение.
Другая возможность — просто вставить весь код, использующий ShaderProgram
, внутрь try
. ShaderProgram
живет очень долго, и поэтому это привело бы к очень большому блоку try
. Это может затруднить чтение кода.
Я чувствую, что должно быть более правильное решение. Каким будет это решение?
try
? Я имею в виду, что если у вас есть исключение, то нет объекта, который вы могли бы использовать после блока try. - person 463035818_is_not_a_number   schedule 07.12.2020try
, не может использовать объект, если он не был успешно создан. - person 463035818_is_not_a_number   schedule 07.12.2020