2016-04-06 4 views
-5

Итак, у меня есть структура, и я хотел бы получить доступ к определенным значениям изнутри в другом методе. Мне не разрешено изменять структуру. Вот структура и несколько функций, которые используются для инициализации и доступа к ней.Получение определенного значения из sctruct C++

struct StdCardConfirmationReceipt 
{ 
private: 
    std::string sOfrIdOrderCentral; 
    std::string sOrderIdOrderCentral; 
    std::string sFulfillmentOrderIdOrderCentral; 

public: 
    StdCardConfirmationReceipt() 
    {  
     sOfrIdOrderCentral = ""; 
     sOrderIdOrderCentral = ""; 
     sFulfillmentOrderIdOrderCentral = ""; 
    } 

    StdCardConfirmationReceipt& operator=(const StdCardConfirmationReceipt& source) 
    { 
     sOfrIdOrderCentral     = source.sOfrIdOrderCentral; 
     sOrderIdOrderCentral    = source.sOrderIdOrderCentral; 
     sFulfillmentOrderIdOrderCentral  = source.sFulfillmentOrderIdOrderCentral; 
    } 

Я хотел бы получить эти значения «sOFrIDOrderCentral» и «sFulfillmentOrdIdOrderCentral и поместить его в другой структуры. Возможно ли это с вышеуказанным кодом? Вот цикл for, который я использую в другом методе для доступа к структуре.

for(std::vector<StdCardConfirmationReceipt>::iterator vIter= mvCardConfirmationReceiptList.begin(); vIter != mvCardConfirmationReceiptList.end(); ++vIter) 
{ 
    //need to accesss OFrIDOrderCentral and sFulfillmentOrdIdOrderCentral 
} 
+3

Подробнее ... немного * пример здесь будет значительно лучше. Это частные свойства, поэтому создайте метод доступа. – tadman

+0

@kfsone Все члены данных структуры являются частными. – NathanOliver

+0

Для такой структуры вам не нужно писать константу и присваивать оператор. – AnatolyS

ответ

0

К сожалению, все эти члены являются частными, поэтому они не могут быть доступны извне класса. Вам нужно либо написать аксессор функцию:

#include <vector> 
#include <iostream> 

struct StdCardConfirmationReceipt { 
private: 
    std::string sOfrIdOrderCentral; 
public: 
    StdCardConfirmationReceipt() : sOfrIdOrderCentral() {} 
    StdCardConfirmationReceipt(std::string s) : sOfrIdOrderCentral(s) {} 
public: 
    const std::string& getsOfrIdOrderCentral() const { return sOfrIdOrderCentral; } 
}; 

int main() { 
    std::vector<StdCardConfirmationReceipt> vec; 
    vec.push_back(StdCardConfirmationReceipt("1")); 
    vec.push_back(StdCardConfirmationReceipt("2")); 
    vec.push_back(StdCardConfirmationReceipt("3")); 
    for (auto vIter = vec.begin(); vIter != vec.end(); ++vIter) { 
     std::cout << vIter->getsOfrIdOrderCentral(); 
    } 
} 

http://ideone.com/kdwyWL

+0

Я предпочел бы более тесное отношение к образцу OP. Может быть что-то вроде 'std :: map ' для хранения _variables_? –

+0

@ πάνταῥεῖ в его вопросе не было никакой карты, но я нормализовал свой ответ на его mvce больше. – kfsone

+0

Поскольку вы * можете * действительно получить доступ к частным членам, я делаю это с помощью downvoting. Ответ на вопрос о том, если вы * должны *, конечно, нет, но это не то, что было задано. – M2tM

-1

Если у вас есть структура, состоящие из частных элементов данных, которые вы хотите получить доступ, вы всегда можете #define private public прямо перед определением структуры и доступом к ним, как нормальный. Если вы можете, просто используйте функции доступа, поскольку это очень плохая практика.

+1

Умышленное обращение к неопределенному поведению наказуемо на 6 месяцев чтения Кнута. Upvoter, позор вам. – SergeyA

+0

Что такое неопределенное поведение здесь? Я знаю, что это ужасная практика, но нужно определить поведение. – fuzzything44

+0

Заменяя модификаторы доступа, вы меняете определение класса. Теперь, если тот же заголовочный файл включен в другую единицу перевода, где не было такой ужасной вещи, вы получаете класс, который по-разному определяется двумя единицами перевода. Ka-Boom. – SergeyA

1

http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html

По существу, вы спрашиваете для доступа к закрытым членам. Цитирую полный источник ссылки, чтобы гарантировать это не идет несвежий:

#include <iostream> 
using namespace std; 

template<typename Tag> 
struct result { 
    /* export it ... */ 
    typedef typename Tag::type type; 
    static type ptr; 
}; 

template<typename Tag> 
typename result<Tag>::type result<Tag>::ptr; 

template<typename Tag, typename Tag::type p> 
struct rob : result<Tag> { 
    /* fill it ... */ 
    struct filler { 
    filler() { result<Tag>::ptr = p; } 
    }; 
    static filler filler_obj; 
}; 

template<typename Tag, typename Tag::type p> 
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj; 

struct A { 
private: 
    void f() { 
    std::cout << "proof!" << std::endl; 
    } 
}; 

struct Af { typedef void(A::*type)(); }; 
template class rob<Af, &A::f>; 

int main() { 
    A a; 
    (a.*result<Af>::ptr)(); 
} 

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

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

+0

Я все еще пытаюсь понять это: 'template class rob ;' Как это не ошибка компиляции - доступ к частному члену таким образом? Я имею в виду, какая формулировка из стандарта позволяет это? – SergeyA

+0

Никакая формулировка в стандарте не запрещает это, конечно. Я недостаточно знаком с языковым стандартом, чтобы процитировать для вас проходы, которые позволяют этот синтаксис. С учетом сказанного, существует часто цитируемый отрывок https://books.google.com/books?id=0klsAQAAQBAJ&pg=PA454&lpg=PA454&dq=C%2B%2B+protects+against+accident+rather+than+deliberate+circumvention+ (мошенничество) и источник = бл & отс = S1r6-byH0P & сиг = yNtFfzBDL6hCL7W1FtVq4Pkme8Y & гл = еп & са = Х & вед = 0ahUKEwjk2dKnx4fMAhUNymMKHbnVDSQQ6AEIHTAA # v = OnePage & д = С% 2B% 2B% 20protects% 20against% 20accident% 20rather% 20than% 20deliberate% 20circumvention% 20 (мошенничество) и F = ложным – M2tM

+0

«C++ защищает от атак, а не за умышленное обход (мошенничество)» -Bjarne Stroustrup – M2tM

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