Как получить значение частного поля типа c ++ в oc-классе? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть класс target-c в iOS, есть поле с типом класса c ++.У меня нет определения класса c ++.
Как получить значение этого поля?
И как изменить значение поля этого типизированного поля c ++?
Например.

@interface A 
    B b // c++ type
@end

class B {
    int c;
}

Как получить значение b?Как изменить значение c?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Редактировать: Я неправильно понял ваш вопрос.

Отказ от ответственности: у меня нет доступа к инструментальной цепочке iOS на момент написания этой статьи, чтобы проверить информацию Objective-C, но яЯ уверен в этом ответе, основываясь на моем прошлом опыте работы с Objective-C и iOS.

Среда выполнения Objective-C обеспечивает самоанализ типа.

Если член C ++ является полем:
Используйте технику из этого поста или аналогичную, затем выделите интересующий вас ивар.
Если вы используете технику петли из вышеупомянутого поста:

if (strcmp(name, "target_field") == 0) {
    ptrdiff_t offset = ivar_getOffset(var);
    CppObject* cppObject = (CppObject*)(((ptrdiff_t*)&targetObjcInst) + offset);
    // Access the public members of CppObject...
}

ЕслиЧлен C ++ - это свойство:
Если бы вы просто обращались к значению свойства Obj-C, я бы сказал, следуйте этому ответу и назовите его днем, но поскольку это значение свойства C ++, подробностинеясно.Я не уверен, что это даже возможно.

C ++ имеет концепцию дружба , обеспечивающую доступ к закрытым членам одного типа из другого.

то есть

class A;

class B {
    friend class A;

    int C;
};

class A {
    int D;

    int sum(const B& b) {
        return b.C + D;
    }
};

Это не распространяется на Objective-C.За исключением какого-то конкретного расширения компилятора, о котором я не знаю, интерфейсы Obj-C не могут быть «друзьями» с типами C ++, поэтому Obj-C не может получить доступ к закрытым компонентам типов C ++.Предоставление публичного доступа / мутатора или обнародование поля - ваши единственные переносимые варианты.

0 голосов
/ 16 декабря 2018

С аксессором и мутатором, также известным как геттер / сеттер:

class B {
  public:
    int getC() { return c };
    void setC(int c_) { c = c_ };
  private:
    int c;
}

int main()
{
    B b;

    B.setC(50); // c = 50

    int x = B.getC() // x = 50;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...