как правильно подключить static функцию в хидер и cpp&
есть такой cpp файл
#include"Object1.h"
using namespace std;
Object1::~Object1(){
}
Object1::Object1(){
}
static Object* create_func()
{
Object1 *temp1 = new Object1();
return temp1;
}
и такой h файл
#pragma once
#include"factory.h"
#include<string>
class Object1: public Object{
public:
Object1();
std::string getName(){return "Object1";}
~Object1();
};
Нужно ли в h файле объявить функцию static Object* create_func()
В институте сказали, что это потенциально опасно, но опасно чем? И почему нельзя объявить в хидере. Препод очень любит с.
Ответы (2 шт):
Теоретически оно вообще не должно работать. В теории эту функцию нельзя юзать в другом .cpp.
Тоесть если есть файл с
Object* create_func()
{
Object1 *temp1 = new Object1();
return temp1;
}
То в другои файле можно написать
Object* create_func();
И использовать её, а со статиком такое не прокатит.
Но вообще ни разу такое не встречал.
У метода часто видел, там static означает, что функция работает без инстанса класса.
Возможно имеет смысл inline? inline приписать можно, чтобы определение в хедер впихнуть.
Опасно тут то, что неясно что начудит компилятор и коллеги, увидев такой статик.
Может просто убрать статик и объявить функцию?
Object* create_func();
В таком виде всё обычно и пишут программы.
Внутри класса static функция означает использование функции без объекта.
Вне определения класса - как-всегда, много экзепляров в каждой единице компиляции. И это приводит к увеличении размера исполняемого файла.
Скорее всего, эту функцию удобнее расположить во внутрь класса :
.h :
class Object1: public Object{
public:
Object1();
std::string getName(){return "Object1";}
~Object1();
// если очень надо, то приватно
// private:
static Object1* create_func();
};
.cpp :
Object1* Object1::create_func()
{
Object1 *temp1 = new Object1();
return temp1;
}
использование :
Object1 * o = Object1::create_func();
Если функция не внутри класса, то нужно писать код во внутрь хедера :
.h :
static Object* create_func();
static Object* create_func()
{
Object1 *temp1 = new Object1();
return temp1;
}
чтобы это определение функции было видно во всех компилируемых .cpp файлах.
Опасность другого подхода будет если вы предварительно объявите static, а потом сделаете функцию в .cpp файле.
.h :
static Object* create_func();
.cpp :
Object* create_func(){
..}
Эта функция будет видна только в одном .cpp файле, где она написана. Из других .cpp файлов запуск этой функции приведёт к ошибке : "нет определения данной функции". Так как её код должен присутствовать во всех .cpp файлах.