Как сделать глобальные постоянные псевдонимы переменных в C ++ - PullRequest
0 голосов
/ 10 февраля 2019

Я довольно новичок в C ++, поэтому извините за любые вопиющие ошибки.

Постановка задачи

Мой код предназначен для математических вычислений, поэтому main.cpp / main.h выполняет настройку, считывает параметры и т. д., а затем выполняет отдельный файл / заголовок, который называется driver.cpp / driver.h, выполняет вычисления.

Чтобы инкапсулировать параметры, я создаю несколько пользовательских типов данных, инициализирую их в main.cpp и передаю их функции, определенной в driver.cpp.Я хотел бы, чтобы эти параметры рассматривались как константы для функций в driver.cpp, и я также хотел бы присвоить им псевдонимы для удобства чтения.Было бы неплохо присвоить им псевдоним один раз вместо каждой функции.Возможно ли это?

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

Идея того, что я хочу:

main.cpp

struct myStruct_t{
    int a,b,c;
};

int main(int argc,char **argv){
    myStruct_t myStruct;
    myStruct.a=1;
    myStruct.b=2;
    myStruct.c=3;

    driver(myStruct);
}

driver.cpp

const int &a,&b,&c;
void func1();
void func2();

driver(const myStruct_t& myStruct){
    a = myStruct.a;
    b = myStruct.b;
    c = myStruct.c;     
    func1();
    func2();  
} 
void func1(){
    // do stuff with a,b,c
}
void func2(){
    // do stuff with a,b,c
}

С другой стороны, он будет работать для реализации драйвера следующим образом.Мне это не очень нравится, потому что мне нужно будет копировать объявление ссылки в каждой функции.

Что работает, но мне не очень нравится:

alt_driver.cpp

void func1(const myStruct_t& myStruct);
void func2(const myStruct_t& myStruct);

driver(const myStruct_t& myStruct){ 
    func1(myStruct);
    func2(myStruct);  
}

void func1(const myStruct_t& myStruct){
    const int& a = myStruct.a;
    const int& b = myStruct.b;
    const int& c = myStruct.c;
    // do stuff with a,b,c
}

void func2(const myStruct_t& myStruct){
    const int& a = myStruct.a;
    const int& b = myStruct.b;
    const int& c = myStruct.c;
    // do stuff with a,b,c
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Если может служить указатель на const, а не ссылка на const, то может сработать что-то вроде следующего.(Для практического решения я позволил себе разделить общие объявления в заголовочный файл driver.h. Это стандартная практика C ++.)

driver.h

#ifndef DRIVER_H
#define DRIVER_H

struct myStruct_t{
    int a,b,c;
};
void driver(const myStruct_t&);
void func1();
void func2();

#endif

main.cpp

#include "driver.h"

int main(int, char **){
    myStruct_t myStruct;
    myStruct.a=1;
    myStruct.b=2;
    myStruct.c=3;

    driver(myStruct);
}

driver.cpp

#include "driver.h"

const int *a0,*b0,*c0;

void driver(const myStruct_t& myStruct){
    a0 = &myStruct.a;
    b0 = &myStruct.b;
    c0 = &myStruct.c;
    func1();
    func2();
}
void func1(){
    const int& a = *a0;
    const int& b = *b0;
    const int& c = *c0;
    // do stuff with a,b,c, such as:
    int d = a+b+c;
    ++d;
}
void func2(){
    const int& a = *a0;
    const int& b = *b0;
    const int& c = *c0;
    // do stuff with a,b,c, such as:
    int d = a+b+c;
    ++d;
}

Вышеупомянутое выглядит почти так же, как вашглобальная ссылка, за исключением того, что адрес хранится и используется явно.Действительно, сгенерированный машинный код, вероятно, идентичен.

Обратите внимание, что я написал const int *a,*b,*c; вместо int *const a, *const b, *const c;.Последний определил бы константные указатели, которые часто бывают полезны, но не то, что вы хотели здесь.Здесь, скорее, вы хотели, чтобы указатели соответствовали.

0 голосов
/ 10 февраля 2019

Если производительность не является фактором, я бы не советовал полагаться на глобальные ссылки на переменные.Я хотел бы предложить доступ к ним с помощью функционального интерфейса.

// Create a namespace for driver.cpp 
// Put all the helper functions and data in the namespace.
namespace driver_ns
{
   myStruct_t const* myStructPtr = nullptr;

   int const& a()
   {
      return myStructPtr->a;
   }

   int const& b()
   {
      return myStructPtr->b;
   }

   int const& c()
   {
      return myStructPtr->c;
   }
}

using namesapce driver_ns;

void func1();
void func2();

driver(const myStruct_t& myStruct){
   myStructPtr = &myStruct;
    func1();
    func2();  
} 

void func1(){
    // do stuff with a,b,c, usig a(), b(), and c()
}
void func2(){
    // do stuff with a,b,c, usig a(), b(), and c()
}

Если вам нужно получить доступ к a, b и c в нескольких файлах, добавьте функциональный интерфейс в общий файл .hи внедрить их в файл, независимый от файлов, в которых они используются.

...