2013-07-22 3 views
4

У меня есть структура в моей программевозвращает структуру, не подвергая его

struct secret_structure{ 
      string a; 
      string b; 
      void *c; 
}; 

У меня есть список таких структур

std::map<string name, secret_structure> my_map 

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

get_from_map(string name, secret_structure * struct) //Kind of function 

У меня есть следующие варианты:

  1. Передайте указатель на secret_structure в функции get_from_map. Структура get_from_map заполняет структуру. Я не хочу этого делать, потому что структура будет выставлена.

  2. У меня могут быть разные функции для возврата различных значений из структуры. Здесь структура не будет отображаться, но не выглядит чистой.

Можете ли вы помочь мне с любым другим вариантом, чтобы сама структура не была обнаружена.

+2

Почему вы не хотите раскрывать структуру? –

+2

Почему бы вам просто не сделать данные членами 'secret_structure' _private_? А затем у вас есть функции доступа для тех частей, которые вы хотите открыть? – jogojapan

+3

Даже если это было возможно, что должен сделать вызывающий объект с этой неэкспонированной структурой? – juanchopanza

ответ

8

Вместо того, чтобы передать структуру можно передать дескриптор, который содержит указатель на реальный объект:

// public_interface.h 

struct MySecretStruct; // I don't want to publish what's inside 

struct WhatYouCanSee 
{ 
    MySecretStruct *msp; // The "P"ointer to "IMPLE"mentation 

    WhatYouCanSee(int a, double b); 
    ~WhatYouCanSee(); 
    WhatYouCanSee& operator=(const WhatYouCanSee&); 
    WhatYouCanSee(const WhatYouCanSee&); 

    void method1(); 
    void method2(int x); 
}; 

методы будут просто упаковщики на вызовы методов реального объекта.

+1

+1 - важная техника. Стоит рассмотреть возможность сделать его не скопированным, хотя, поскольку выбор семантики будет довольно произвольным и потенциально запутанным. (например, если ваш 'operator = (const WhatYouCanSee &)' копирует данные между 'MySecretStructs' или просто делает адрес' msp' одним и тем же 'MySecretStruct'?) –

+0

@TonyD: Как и с обычным (не скремблированным) объектом, вы можете решить что делать для создания задания и копирования. Одним из решений, которые я нашел часто полезными, является необходимость подсчета обратной копии экземпляра, чтобы можно было скопировать передний объект (и вы можете поместить его в стандартные контейнеры), но реальный экземпляр не копируется. – 6502

+0

О, я вижу, вы только что отредактировали «The» Pointer »для« IMPLE »mentation» в свой ответ. Я действительно думал, что вы предлагаете собственный интерфейс прокси (без права собственности) для конкретного доступа, необходимого для кода, вызывающего поиск. 'pImpl' подразумевает * all * клиентский код, используя' WhatYouCanSee' (и, следовательно, косвенность, право собственности, дополнительное использование кучи и потенциально более плотный интерфейс). Либо может подойти - черт в деталях. –

1

Затем вернитесь в json или xml или в другом формате.

или ASN.1 может быть более компактным

+0

-1 В этом вопросе нет ничего, что могло бы предполагать, что формат анализа во время выполнения является желательным, в то время как он вводит значительную новую поверхность для ошибок во время выполнения, замедляет работу и затрудняет использование Результаты.Примечания: одна из свобод, которую это позволяет - возвращение результатов, которые не соответствуют 1: 1 с полями 'secret_structure', лучше обрабатывается отдельной' struct'; Еще один аспект - это собственность, но поиск структуры в «карте» может вернуть ее по ссылке «const» по значению «shared_ptr», «weak_ptr» или «unique_ptr» ... в других форматах тоже нет. –

+0

@TonyD Ваш комментарий звучит скорее как хороший ответ на исходный вопрос? Почему вы комментируете мой комментарий? –

+1

«Почему вы комментируете мой комментарий?» - вы ввели выше «ответ»; комментарии попадают непосредственно под вопрос. Люди неявно приглашаются голосовать и комментировать ответы - это основная концепция этого веб-сайта, и как наилучшие ответы «плавают» в верхней части страницы. Ответ 6502 рекомендует тот же промежуточный подход «struct», о котором я упоминаю, - не имеет смысла в добавлении дублирующего ответа. Мой комментарий в основном заключался в том, чтобы указать, что побочные выгоды от вашего ответа доступны без нежелательного перехода к промежуточному формату данных. –

1

Вы не можете сделать это (по крайней мере, не с обычной C++), и я не могу думать хорошую причину, по которой вы должны сделать это. Если ваша внутренняя структура не так, как вы хотите опубликовать свою информацию, найдите подходящий способ/тип данных и определите преобразование.

7

Что вы хотите, это идиома pimpl.

Pimple Idiom

В основном вы объявляете класс, который имеет интерфейс с секретной структурой и содержит указатель на экземпляр секретной структуры. Вы можете перенаправить объявление struct без указания деталей реализации. Затем в файле CPP вы получаете доступ к секретной структуре. Это может быть предоставлено в формате заголовка/двоичного файла, если вы предоставляете его третьим сторонам.

Смежные вопросы