как правильно подключить 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();

В таком виде всё обычно и пишут программы.

→ Ссылка
Автор решения: AlexGlebe

Внутри класса 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 файлах.

→ Ссылка