Генерация подписи функции автоматически в C ++ - PullRequest
1 голос
/ 08 марта 2019

У меня проблема с генерацией функций, она становится довольно утомительной, копирование и вставка У меня около 400 функций.Что было бы самым простым способом автоматически сгенерировать их?
Я надеялся просто напечатать IController.h, а остальное было бы автоматически заполнено, если бы кто-нибудь мог направить меня к такой вещи, которая была бы великолепна.

У меня есть 4 отдельных файла.

IController.h
Controller.h
Controller.cpp
MockController.h

Например, в файле IController.h у меня есть функция с именем display

class IController
{
 public:
 virtual void display(Gui* gui) = 0; 
}

Controller, класс наследуется от IController, а ключевое слово virtual удаляется.и = 0.

class Controller : public IController
{
  public:
  void display(Gui* gui);
}

Controller.cpp будет содержать определение

void Controller::display(Gui* gui)
{

}

И, наконец, MockController.h будет содержать следующее

class MockController : public IController
{
 public:
  MOCK_METHOD1(display, void(Gui* gui));
};

1 Ответ

0 голосов
/ 12 марта 2019

У меня ушло несколько дней, чтобы разобраться, надеюсь, это поможет кому-то, кому я смог решить проблему выше с помощью скрипта, который я сделал ниже. gmock_gen.py в настоящее время не работает с python 3.7.2, я установил 2.7.13 и скрипт ниже работает.

пользователь должен генерировать код только для первого класса интерфейса, а все остальные файлы создаются автоматически.

import os

#read contents of IController.h
filename = "IController.h"
file = open(filename,"r")

#variables
flag = False
classheader = ""
mockheader = ""
classbody = None
header = []
classitems = []

#read each line in the file
for line in file:
    # if the class name has been found 
    if(filename[:-2] in line):
        flag = True
    # save all data before the calss name
    if flag == False:
        header.append(line)
    #
    if filename[:-2] in line:
        flag = True
        classname = filename[1:-2]
        line = line.replace("class ", "public ")
        classbody = "class " + classname + " : " + line

    # remove virtual = 0
    if "virtual" in line:
        line = line.replace("virtual","")
        line = line.replace(" = 0","")
        classitems.append(line)

classbody += "\n"
classbody += "{\n"
classbody += "  public:\n"

for x in classitems:
     classbody += x 
     classbody + "\n"

classbody += "};"

for x in header:
    classheader += x

classheader += "#include " + "\""  + filename + "\"" + "\n\n"
mockheader += classheader
classheader += classbody

#create controller.h file
f = open(filename[1:], "w")
f.write(classheader)

cppbody = ""

for x in classitems:
    temp = x.split(" ", 2)
    temp2 = temp[1] + " " + filename[1:-2] + "::" + temp[2].replace(";","{\n\n\n}\n")
    cppbody += temp2 

#create controller.cpp file
cppfilename = filename[1:-2] + ".cpp"
f = open(cppfilename,"w")
f.write(mockheader)
f.write(cppbody)


mocktemp = "Temp" + filename[1:]
mockfilename = "Mock" + filename[1:]

input = "python gmock_gen.py " + filename
os.system(input + " > " + mocktemp)

#create MockIController.h
with open(mocktemp) as f:
    with open(mockfilename, "w") as f1:
        f1.write(mockheader)        
        for line in f:
            f1.write(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...